您可能知道,无界通配符 set<?> 可以容纳任何类型的元素,而原始类型set也可以容纳任何类型的元素。那它们之间有什么区别呢?
关于set<?>有两个事实:
因此 set<?> 可以容纳任何类型的element(item 1),但我们不能将任何元素放入其中(item 2)。这两个陈述是否彼此冲突?当然不是。以下两个示例可以清楚地说明这一点:
** item 1表示以下情况:**
//合法 代码 public static void main(string[] args) { hashset<integer> s1 = new hashset<integer>(arrays.aslist(1, 2, 3)); printset(s1); hashset<string> s2 = new hashset<string>(arrays.aslist("a", "b", "c")); printset(s2); } public static void printset(set<?> s) { for (object o : s) { system.out.println(o); } }
由于 set<?> 可以容纳任何类型的元素,因此我们仅在循环中使用object。
** item 3是指以下非法情况:**
//非法代码 public static void printset(set<?> s) { s.add(10);//this line is illegal for (object o : s) { system.out.println(o); } }
因为我们不完全知道 <?> 的类型,所以除了null之外,我们无法添加其他任何内容。出于相同的原因,我们无法使用 set<?> 初始化集合。以下是非法的:
//非法代码 set<?> set = new hashset<?>();
原始类型集和无界通配符集<?>有什么区别?
此方法声明很好:
public static void printset(set s) { s.add("2"); for (object o : s) { system.out.println(o); } }
因为原始类型没有限制。但是,这很容易破坏集合的不变性。
简而言之,通配符类型是安全的,而原始类型则不是。我们不能将任何元素放入set<?>中。
如果要使用泛型类型,但不知道或不在乎该参数的实际类型,则可以使用<?> 。它只能使用方法的参数。
例如:
public static void main(string[] args) { hashset<integer> s1 = new hashset<integer>(arrays.aslist(1,2,3)); hashset<integer> s2 = new hashset<integer>(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; }
如对本文有疑问, 点击进行留言回复!!
荐 深入理解Java中的BigInteger和 BigDecimal,再也不怕面试了
tomact正常启动,但是在日志文件报错java.lang.NoClassDefFoundError: java/util/logging/Logger
servlet整合quartz:servlet中使用quartz,服务器启动时加载任务
荐 Java——集合中的Map接口通过HashMap类实现一些常用的方法
SpringBoot整合mybatis访问时报错Invalid bound statement (not found)
网友评论