Я изучал дженерики и наткнулся на методы моста.
Предположим, что следующие классы
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
Я не понимаю, почему нам нужен состав для одного сценария, а не для другого.