Почему переопределение метода не работает с параметрами Primitives-Wrapper и Super-Subclasses, а сгенерирует броски? - PullRequest
0 голосов
/ 21 октября 2019

Я проверил следующее

class raexception extends Exception{

}
class baexception extends raexception{

}

interface ram{
  public void miya(float a) throws raexception;
}
public class Classy implements ram{
  @Override
  public void miya(Float a) throws baexception {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  } 
}

В приведенном выше случае использования

  1. Я могу дать подкласс в секции Throws

  2. В параметрах я не могу давать ни класс Wrapper, ни подкласс.

Вопрос : Правильно ли это понимание? если да, есть ли какая-либо конкретная причина, по которой выбросы разрешены с подклассом, но в параметре метода подкласс не разрешен?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Ваше понимание верно. Подкласс также может использоваться в типе возвращаемого значения. Для параметров можно использовать суперклассы , а не подклассы.

Какой бы метод вы не использовали, вы в некотором роде «выполняете требование», не так ли? В этом случае для интерфейса требуется метод miya, который принимает значение float и может выдавать raexception. Вы можете выполнить это несколькими способами.

Метод с именем miya, который принимает float, но выдает baexception, выполняет требование. Почему? Вы можете думать об этом так: вызывающие метод ожидают, что ваш метод выбросит raexception, поэтому они могут обработать raexception. Теперь они могут справиться с baexception? Конечно они есть! baexception является подклассом raexception.

Вы можете использовать ту же цепочку рассуждений, чтобы выяснить, почему вы можете использовать суперклассы в типах параметров и почему вы можете использовать подклассы в возвращаемых типах.

Что касается типов обертки, то просто, когда примитивный аргумент передается типу обертки, он должен быть в штучной упаковке. Вызывающие ваш метод ожидают, что в метод добавляются только примитивные аргументы, а не бокс. Вы должны думать о float и Float как о двух отдельных типах. Причина, по которой вы обычно можете конвертировать между ними в контексте присваивания, заключается в том, что компилятор хорош.

1 голос
/ 21 октября 2019

Ваша реализация должна быть совместима с определением в интерфейсе.

Поскольку baexception является подклассом raexception, не проблема: реализация может выдать любую baexception: это также raexception.

Вы не можете реализовать метод с аргументом Float, так как интерфейс указывает float. Метод в классе не реализует метод в интерфейсе.

Я думаю, компилятор может сгенерировать второй метод, реализующий miya(float a), и сгенерировать код для вставки аргумента, но что произойдет, если подкласс переопределитЭто? или оба метода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...