Позвольте мне показать мой быстрый пример:Неправильный общий тип возвращаемого
public class Main {
public static abstract class Food {
}
public static abstract class Fruit extends Food {
public String getJuice(){
return "juice";
}
}
public static abstract class Container<T extends Food> {
private T food;
public final T get(){
return food;
}
}
public static abstract class Crate<T extends Fruit> extends Container<T> {
}
public static void Bar(Crate crate) {
Food f = crate.get(); //compiles fine
//Fruit f2 = crate.get(); //can't compile
}
}
Когда данный сырьевой тип, crate.get()
возвращает Food
вместо Fruit
- примечание:
Crate
объявлен какCrate<T extends Fruit> extends Container<T>
такCrate<Food>
запрещено ,
Мне просто интересно: почему метод T get()
не возвращается Fruit
? Почему требуется Crate<Fruit>
?
Вы не можете сделать 'Crate', потому что вы заявили, что 'Crate '. «Продовольствие» не распространяется на «Фрукты». –
Radiodef
Ну, это очевидно. Просто смотрит на меня, поскольку компилятор не знает, чего он хочет. Сказать, что 'crate' является' Crate 'и не является одновременно –
TomatoMato
@TomatoMato Пожалуйста, объясните свой вопрос немного ясно. До сих пор я не понял, каков ваш вопрос на самом деле? –