2010-10-02 41 views
3

让我们有下面的代码:另一个Java泛型混乱

public class TestGenerics { 
    static <T> void mix(ArrayList<T> list, T t) { 
     System.out.println(t.getClass().getName()); 
     T item = list.get(0); 
     t = item; 
     System.out.println(t.getClass().getName()); 
    } 
    public static void main(String[] args) { 
     ArrayList<Object> list = new ArrayList<Object>(); 
     list.add(new Integer(3)); 

     mix(list, "hello world"); 
    } 
} 

在输出我得到:

java.lang.String 
java.lang.Integer 

这是废话 - 我们刚刚分配IntegerString没有得到ClassCastException!我们不能这样写:

String s = new Integer(3); 

但这就是我们刚才在这里所做的。

这是一个错误还是什么?

回答

9

在你的情况为listArrayList<Object>T被认为是一个Object所以你可以看到事情:

static void mix(ArrayList<Object> list, Object t) 

所以你分配一个IntegerObject(这是一个String之前)。

Object obj = new Integer(3); 
obj = "Hello"; //No CCE here 
2

你有一个Object的列表。列表中的一个对象是一个字符串,另一个是整数。 getClass返回运行时对象的类型,而不是静态类型。这里没有涉及铸件。

2

在我看来,好像getClass()返回对象的动态(运行时)类型,而泛型仅处理静态(编译时)类型信息。

在控制台上打印的是实际的动态类型。

但是,在您的示例代码中,T应该是Object,因此t = item是完全有效的赋值。