您的位置:首页 > 编程语言 > Java开发

java泛型的一些了解~

2018-11-28 17:38 435 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_20911371/article/details/84589173

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允许使用这种表示是为了兼容以前的代码。
尽可能的去使用泛型。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: