代码之家  ›  专栏  ›  技术社区  ›  Denys Kniazhev-Support Ukraine

又一个java泛型混淆

  •  3
  • Denys Kniazhev-Support Ukraine  · 技术社区  · 15 年前

    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
    

    胡说八道-我们刚刚分配了 Integer String 没有得到 ClassCastException

    String s = new Integer(3);
    

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

    是虫子还是什么?

    3 回复  |  直到 15 年前
        1
  •  9
  •   Colin Hebert    15 年前

    list 是一个 ArrayList<Object> T 被视为 Object

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

    所以你分配了一个 Integer 到一个 (这是一个 String

    Object obj = new Integer(3);
    obj = "Hello"; //No CCE here
    
        2
  •  2
  •   Mark Byers    15 年前

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

        3
  •  2
  •   stakx - no longer contributing Saravana Kumar    15 年前

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

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

    但是,在您的示例代码中, T 是那种类型的 Object 因此 t = item