Приведение типов при использовании дженериков
Ниже пример кода, где происходит не совсем понятные вещи, связанные с преобразованиями при использовании дженериков. Есть два класса, один наследует другой (А и B). Так же есть обобщенный метод (f1). Методу сообщаем, что хотим, что бы он возвращал объекты типа B. В методе создаем новый объект класса А и пытаемся его преобразовать типу B. Судя по всему это не получается, но ошибки не генерируется. Более того, объект типа A возвращается из метода f1() так же без ошибок, хотя А для B является предком, а не потомком. Ошибка происходит в момент попытки присвоить указателю B b результаты выполнения f1()
- Когда у f1, поменялся тип выходных данных? Был назначен тип B, но объект класса А успешно смог быть возвращен. Т.к. В потомок А, а не наоборот, то это явно не полиморфизм.
- Почему преобразование T t = (T) new A(); не выдало ошибок? Оно же не произошло.
public class Main
{
public static void main(String[] args) {
Main main = new Main();
B b = main.<B>f1();
}
public <T> T f1(){
T t = (T) new A();
System.out.println(t instanceof B); //false
return t;
}
}
class A {
}
class B extends A{
}
Ответы (1 шт):
- Когда у f1, поменялся тип выходных данных? Был назначен тип B, но объект класса А успешно смог быть возвращен. Т.к. В потомок А, а не наоборот, то это явно не полиморфизм. -
Полиморфизм — это способность обьекта использовать методы производного класса, который не существует на момент создания базового.
Так же есть обобщенный метод (f1). Методу сообщаем, что хотим, что бы он возвращал объекты типа B - шо значит у вас обобщенный метод? В java могут существовать методы c одинаковым наименованием но различный по параметрам. Так что у вас не получится иметь один метод на все случаи жизни.
- Почему преобразование T t = (T) new A(); не выдало ошибок? Оно же не произошло. - Это явное преобразование, вы не получите ошибку во время компиляции.