关于方法的泛型
方法1:
public static <T> T fun1(T t){
return t;
}
方法2:
public static <T> T fun2(String str){
return (T)new Object();
//这里有警告 Type safety: Unchecked cast from Object to T
}
问题:
方法1很好理解,虚拟机根据传入的参数T推断返回值.
方法2就很费解啊,编译器怎么知道我返回的是什么?关键是如下调用方法还能编译通过,并且没有警告:
int s = fun2("ssssssssssss");//传入参数String,返回类型int
System.out.println(s);
------解决方案--------------------
? 表示不确定的java类型。
T 表示java类型。
K V 分别代表java键值中的Key Value。
E 代表Element。
Object跟这些东西代表的java类型有啥区别呢?
Object是所有类的根类,是具体的一个类,使用的时候可能是需要类型强制转换的,但是用T ?等这些的话,在实际用之前类型就已经确定了,不需要强制转换。
------解决方案--------------------
int s = fun2("ssssssssssss");
编译器会根据调用的返回值推断出是Integer类型。
实际上虚拟机层面并不知道对象是不是泛型,一切都在编译时搞定的。