0
package com.test.scjp;

import java.util.List;
import java.util.ArrayList;

public class TestGeneric {
    public static void main(String args[]){
        try{
            List<String> l = new ArrayList<String>();
            TestGeneric t = new TestGeneric();
        //t.test(l);
            System.out.println("Test");
            l=t.test(l);
            System.out.println("Test2");

            System.out.println(l.get(0));
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    public List<String> test(List l){
        System.out.println("Test0");
        l.add(new Integer(1));
        System.out.println("Test1");
        return l;
    }
}

当我运行此代码 20 次时,我得到不同的输出:

输出 1:

Test
Test0
Test1
Test2
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at com.test.scjp.TestGeneric.main(TestGeneric.java:16)

输出 2:

Test
Test0
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at com.test.scjp.TestGeneric.main(TestGeneric.java:16)
Test1
Test2
4

2 回答 2

2

System.outSystem.err在不同的线程上工作。两个线程在不同时间访问共享资源(控制台)。

另请参阅System.out 和 System.err 调用和Java的随机打印顺序:System.out.println 和 System.err.println 乱序

于 2013-05-29T22:00:49.730 回答
0

在测试内部,您的列表不是通用的 - 因此您可以向其中添加任何对象。

问题是在它之外,您使用的是仅限于字符串的列表。

正是这种冲突导致了您的问题。

于 2013-05-29T22:00:41.930 回答