日期:2014-05-20  浏览次数:20632 次

关于泛型
本帖最后由 FourQueue 于 2013-04-16 11:43:18 编辑
关于方法的泛型

方法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类型。

实际上虚拟机层面并不知道对象是不是泛型,一切都在编译时搞定的。