Java 泛型测试

package net.cmono._20130708;
import java.util.ArrayList;
public class GenericTest {
    public static void main(String[] args) throws Exception {
        // 数组定义的时候不能这样设置泛型
        // Vector<String> vectorList[]=new Vector<String>[10];
        //Vector<String> vectorList = new Vector<String>();
                
                
        // 这样定义了一个泛型,编译的时候只能加入String类型的数据
        ArrayList<String> collection1 = new ArrayList<String>();
        collection1.add("abc");
        // collection1.add(123); 123加不进去
        // 在字节码里面是没有关于泛型的信息的,我们可以通过反射绕过泛型的设置
        Integer ni = new Integer(99);
        collection1.getClass().getMethod("add", Object.class)
                .invoke(collection1, ni);
        System.out.println("collection1\n-----------------------------");
        System.out.println(collection1.get(0).getClass());
//      System.out.println(Integer.valueOf(collection1.get(1)));
        System.out.println(String.valueOf(collection1.get(1)));// 这里为什么就不行了呢?
        System.out.println("----------------------------------\n");
                
                
        ArrayList<Integer> collection2 = new ArrayList<Integer>();
        collection2.add(2);
        collection2.getClass().getMethod("add", Object.class)
                .invoke(collection2, "22222");
        System.out.println("collection2\n-----------------------------");
        System.out.println(collection2.get(0));
        System.out.println(Integer.valueOf(String.valueOf(collection2.get(1))));// Integer类型成功绕过编译器
        System.out.println(collection2.get(0).intValue());
        System.out.println(collection2.get(1));
                
        // 这里就证明了字节码里面是没有泛型信息的
//      System.out.println(collection1.getClass().getGenericSuperclass());
//      System.out.println(collection2.getClass().getGenericSuperclass());
//      System.out.println(collection1.getClass() == collection2.getClass());
//      System.out.println("----------------------------------------------------------");
//      System.out.println(((ParameterizedType)collection1.getClass().getGenericSuperclass()).getClass().getName());
//      System.out.println(((ParameterizedType)collection2.getClass().getGenericSuperclass()).getClass().getName());
                
    }
}

点击查看原图


知识共享许可协议
《Java 泛型测试》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
相邻依据:发表时间
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

1 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     159.16ms