java泛型的一些了解~

java泛型

泛型通常是指集合中用于适配某一种对象类型的说法,类似于Set<?>,List<?>。而泛型是在java1.5之后提出的概念,在没有泛型时,java中实现集合的方式是类似于Set的这种原生态类型。下面就区分一下Set<?>和Set以及Set<Object>,Set<String>的区别。
Set:Set表示的集合类型的原生态类型,是java1.5版本之前普遍使用的初始化方法。

       Set s = new HashSet();
        String string = "大橘子";
        Integer integer = 2;
        s.add(string);
        s.add(integer);
        for(Iterator i = s.iterator();i.hasNext();){
            String msg = (String)i.next();
            System.out.print(msg);
        }

这段代码在编译的时候是没有提示错误的,但是运行的时候会报ClassCastException。effectiveJava中明确提到,出现的问题应该尽快发现,最好是在编译时就发现。可以发现,Set这种原生态类型的初始化方法,就使得我们不得不去花精力去预防这种错误的发生,因此,在java1.5版本之后就不应该去使用这种形式。(之所以还允许这么使用,是因为要兼容1.5之前的代码)

Set<?>:问号中表示通配符,可以随便填写(非关键字,字母开头),这就是泛型的表示方式,他表示该集合中只能存放任意且确定的一个类型。

        GenericCustom<String> genericCustom1 = new GenericCustom<String>();
        GenericCustom<Integer> genericCustom2 = new GenericCustom<Integer>();

        String string = "";
        Integer integer = 0;

        genericCustom1.printClassName(string);
        genericCustom2.printClassName(integer);
		public class GenericCustom<guicheng> {
		    public void printClassName(guicheng s){
		        System.out.println(s.getClass());
		    }
		}

Set<Object>:这种方式表示该集合能够接收任何类型对象的集合,它是一个参数化类型。虽然它跟Set这种原生态类型都能接收任意类型的对象,但是在安全性上,前者显然是更优的。可以看下这个例子(参考effectiveJava书中的例子):

    public static void main(String[] args) {
        List<String> strings = new ArrayList<String>();
        unsaveAdd(strings,222);
        String s = strings.get(0);
    }

    private static void unsaveAdd(List ls,Object o){
        ls.add(o);
    }

在用List这种原生态类型时,编译是不会报错的,但是执行strings.get(0)方法,是在List<String>中读取一个整型值,这个时候程序就会抛出ClassCastException异常,这显然是不希望看到的结果。因此如果将原生态类型的表示换成List<Object>的参数化类型,程序就会在编译的时候给你提示:
在这里插入图片描述
因此,总结一下,Set和List这种原生态类型的表示应该杜绝使用,他们是不安全的,java允许使用这种表示是为了兼容以前的代码。
尽可能的去使用泛型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值