Нужно ли нам всегда приводить типы возвращаемых данных для метода моста? - PullRequest
0 голосов
/ 03 апреля 2020

Я изучал дженерики и наткнулся на методы моста.

Предположим, что следующие классы

public  class  Generics <T> {        
    T i;
    public T m(){
        return i;
    }
}
public class Exgen extends Generics<LocalDate> {
    public LocalDate m(){
        return LocalDate.now();
    }
}    

я знаю с типом стирания для вызова, подобного следующий компилятор кода генерирует метод моста.

Generics<LocalDate> generics1=new Exgen();
LocalDate h=generics1.m();

И метод моста будет public Object m(). Так как это возвращает Object, нам не нужно приведение для оператора LocalDate h=generics1.m();

Но предположим, что два класса расширяют другой, когда у нас есть ко-вариантные типы возврата, нам нужно приведение.

public class Highier{

    public Object t(){
      return new String();
    }
}


public class Lower extends Highier  {

   public String t(){
      return new String();
    }
}

Но когда мы делаем следующее, нам нужен состав.

Highier h=new Lower();
String s=(String)h.t();//without this cast it shows an error

Я не понимаю, почему нам нужен состав для одного сценария, а не для другого.

1 Ответ

0 голосов
/ 06 апреля 2020

Вы должны привести его во втором примере, потому что все, что знает компилятор, это то, что h имеет тип Higher, чей метод t возвращает Object. Он не может знать, что на самом деле Lower имеет более конкретный c тип возвращаемого значения (String). Вы должны были бы явно объявить эту переменную как экземпляр Lower.

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