摘要:因为符号可以匹配任意类型,因此可以处理任意类型的数据。因为原生态类型没有限制,所以它很容易是集合混乱,换句话说,无界通配符是安全的而原生态类型不是安全的。
我们都知道无界通配符(unbounded wildcard) Set>可以处理任意类型数据,原生态类型(raw type)Set也能处理任意类型数据,但是他们区别是什么呢。1、关于Set>的两个要点。
因为符号?可以匹配任意类型,因此Set>可以处理任意类型的数据。
因为我们不知道?指的是什么类型,因此我们不能忘Set里面添加任何类型的数据。
这两点看起来是不是很矛盾,其实并不矛盾,看下面的两个例子
第一要点代码如下
//代码不报错 public static void main(String[] args) { HashSets1 = new HashSet (Arrays.asList(1, 2, 3)); printSet(s1); HashSet s2 = new HashSet (Arrays.asList("a", "b", "c")); printSet(s2); } public static void printSet(Set> s) { for (Object o : s) { System.out.println(o); } }
第二要点代码如下
public static void printSet(Set> s) { s.add(10);// 本行代码报错 for (Object o : s) { System.out.println(o); } }
这是因为我们不知道?所指类型,因此除了null外的所有类型我们都不能往里面添加。同样的,我们不能初始化一个Set类型为?,如下
Set> set = new HashSet>();2、Set vs Set>
看如下代码,是不会报错的。
public static void printSet(Set s) { s.add("2"); for (Object o : s) { System.out.println(o); } }
因为原生态类型没有限制,所以它很容易是集合混乱,换句话说,无界通配符是安全的而原生态类型不是安全的。
3、何时使用Set>当你使用泛型(generic type),但是你又不想关心实际泛型是什么的时候,使用无界通配符。如下:
public static void main(String[] args) { HashSets1 = new HashSet (Arrays.asList(1,2,3)); HashSet s2 = new HashSet (Arrays.asList(4,2,3)); System.out.println(getUnion(s1, s2)); } public static int getUnion(Set> s1, Set> s2){ int count = s1.size(); for(Object o : s2){ if(!s1.contains(o)){ count++; } } return count;
转自我的博客园 http://cnblogs.com/qins/
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70862.html
类型擦除 泛型被引入到Java语言中,以便在编译时提供更严格的类型检查并支持通用编程,为了实现泛型,Java编译器将类型擦除应用于: 如果类型参数是无界的,则用它们的边界或Object替换泛型类型中的所有类型参数,因此,生成的字节码仅包含普通的类、接口和方法。 如有必要,插入类型转换以保持类型安全。 生成桥接方法以保留扩展泛型类型中的多态性。 类型擦除确保不为参数化类型创建新类,因此,泛型不会...
摘要:然而中的泛型使用了类型擦除,所以只是伪泛型。总结本文介绍了泛型的使用,以及类型擦除相关的问题。一般情况下泛型的使用比较简单,但是某些情况下,尤其是自己编写使用泛型的类或者方法时要注意类型擦除的问题。 简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型。泛型可以用于类、接口、方法,通过使用泛型可以使代码更简单、安全。然...
博客地址:Java泛型:类型擦除 前情回顾 Java泛型:泛型类、泛型接口和泛型方法 类型擦除 代码片段一 Class c1 = new ArrayList().getClass(); Class c2 = new ArrayList().getClass(); System.out.println(c1 == c2); /* Output true */ 显然在平时使用中,ArrayList...
摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...
阅读 2002·2023-04-25 16:53
阅读 1443·2021-10-13 09:39
阅读 607·2021-09-08 09:35
阅读 1642·2019-08-30 13:03
阅读 2123·2019-08-30 11:06
阅读 1833·2019-08-30 10:59
阅读 3190·2019-08-29 17:00
阅读 2289·2019-08-23 17:55