分享

Java泛型思考

 shaobin0604@163.com 2006-08-30

大家来看看这端程序,我最出发在csdn里

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

public class Fangxin {
   
    public static void main(String [] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        new Product().prt(list);
    }
   
}

class Product {
    public void prt(List<String> l) {
        System.out.println(l);
    }
}

=====================================

编译器:不通过,说无法将Product中的prt(java.util.List<java.lang.String>)应用于(java.util.List<java.lang.Integer>)

但改变代码为这样后

import java.util.ArrayList;
import java.util.List;
public class Fangxin {
   
    public static void main(String [] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        System.out.println();
        new Product().prt(list);
    }
   
}

class Product <T> {
    public void prt(List<String> l) {
        System.out.println(l);
    }
}

===========================================
编译器:使用了未经检查或不安全的操作。
但能编译通过并运行显示
[1, 2]

 

原因是这样的:(也要感谢kezhu2003(炎阳天)的帮助)

generic class Product<T>在JVM运行时是不存在的,Product叫原始类型,原始类型不是类型安全的.这个在编译时是检测不出的,运行时才报错.
而当一个generic class使用原始类型时,其方法里的参数也就相应的使用了原始形态,如此列的java.util.List而不是java.util.List<String>
固new Product().prt(lt)时可以运行.

但product非generic class 则 prt(List<String> l)在jvm编译时会对l进行类型检查,

Lsit<String> l 是类型安全的,因为其用了generic collection

所以会报错,编译不通过。

 

所以建议大家多用泛型,这样可以避免很多麻烦

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约