Как переменная типа допускает неправильный тип?
package org.my.java;
public class TestTypeVariable {
static <T,A extends T> void typeVarType(T t, A a){
System.out.println(a.getClass());
System.out.println(t.getClass());
}
public static void main(String[] s){
int i= 1;
typeVarType("string", i);
}
}
при запуске, следующий результат:
class java.lang.Integer
class java.lang.String
Как A
иметь тип Integer
, если он уже ограничен верхним значением String
?
Пожалуйста, объясните мне об этом.
Ответы
Ответ 1
Две вещи здесь:
- существует простое решение для "плохого" ввода: T не String, а Object. И Integer расширяет Object. Но учтите: это работает только с возможностями расширенного типа вывода Java8. С Java7 ваш вход не будет компилироваться!
- заблуждение на вашем конце:
getClass()
происходит в время выполнения и поэтому возвращает определенный класс переданных объектов - независимо от того, что компилятор думает о дженериках во время компиляции.