Generics - неправильное несоответствие при предоставлении бетонного типа к общему классу
-
28-09-2019 - |
Вопрос
Простая Java Regions Вопрос: у меня есть два класса - один из которых использует дженерики для определения его типа, другой, который расширяет этот класс, обеспечивающий бетонный тип.
public class Box<Item> {
...
}
public class Toolbox extends Box<Tool>{
...
}
Учитывая, что Toolbox расширяет поле, обеспечивая инструмент в качестве фактического типа для общего заполнителя, я бы подумал, что должно быть возможно сделать что-то подобное:
Box<Tool> box = new Box();
Toolbox toolbox = box;
Однако, похоже, это вызывает несоответствие типа. Почему это?
Решение
Box<Item>
это несвязанный универсальный тип. Box<Tool>
это определенная связанная версия того же родового типа. Toolbox
это подкласс Box<Tool>
И таким образом дискретный тип из Box<Tool>
.
Другие советы
Это не очень нуждающаяся проблема. Ваша проблема заключается в том, что вы назначаете объект менее конкретного типа для переменной более конкретного типа.
У вас будет такая же проблема, если вы попытались назначить объект к строковой переменной, даже если строка расширяет объект.
Вы должны, однако, быть в состоянии написать Box<Tool> box = new Toolbox();
с указанной структурой класса. Просто не наоборот.