T和?都表示不确定的类型。
T的意义是自定义范型,?表示通配符范型。
T其实只是一个代号,相当于对范型的命名,你可以按照Java命名规范给他任意命名,可以是E可以是D可以是UnkownClass。
而如果你写了?则表示在告诉JVM:“我是想用Java的范型来编写这段代码,我在这里并不是要用原生类型,但是在当前这种情况下,范型参数可以持有任何类型。”
引号这段话来自《Thinking in Java》。
换句话说,当你写?的时候,?可以是T可以是E可以是D可以是UnkownClass。
以上是理论区别,在实践中最明显的一个区别就是T是可以进行操作的,但是?不行。
public static void main(String[] args) {
System.out.print(test(1));
System.out.print(test(1L));
System.out.print(test(1D));
}
private static <UnkownClass extends Number> String test(UnkownClass x){
if(x instanceof Integer){
return "Int-" + x;
}else if(x instanceof Long) {
return "Long-" + x;
}else {
return "Other";
}
}