java – 为什么将变量声明为通配符类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么将变量声明为通配符类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1435字,纯文字阅读大概需要3分钟。
内容图文
![java – 为什么将变量声明为通配符类型](/upload/InfoBanner/zyjiaocheng/819/9b0f34725676498e9803e1aa9e25bd11.jpg)
在Java tutorials中,它有时写成这样的东西:
Set<?> unknownSet = new HashSet<String>();
虽然我理解在类定义和方法中使用类型参数和通配符的好处,但我想知道以下内容:
>为变量提供包含通配符的类型有什么好处?
>在现实生活中,人们会这样做,何时?
解决方法:
通配符仅在方法参数声明中非常有用,因为它们增加了可接受参数类型的范围,例如:
void original(List<Number> list) { /* ... */ }
void withUpperWildcard(List<? extends Number> list) { /* ... */ }
void withLowerWildcard(List<? super Number> list) { /* ... */ }
original(new ArrayList<Number>()); // OK.
original(new ArrayList<Integer>()); // Compiler-error.
original(new ArrayList<Object>()); // Compiler-error.
withUpperWildcard(new ArrayList<Number>()); // OK.
withUpperWildcard(new ArrayList<Integer>()); // OK.
withLowerWildcard(new ArrayList<Number>()); // OK.
withLowerWildcard(new ArrayList<Object>()); // OK.
返回类型中的通配符会使您的类的用户生活变得困难(或者说相当混乱),因为您必须传播它们,或者进行明确的工作以使它们消失,例如:
List<? extends Number> method() { /* ... */ }
// Compiler error.
List<Number> list1 = method();
// OK, but yuk!
List<? extends Number> list2 = method();
// OK, but the list gets copied.
List<Number> list3 = new ArrayList<Number>(method());
您的局部变量中的通配符不是必需的(除了接受通配符返回方法的结果).
引用Effective Java 2nd Ed:
If the user of a class has to think about wildcard types, there is probably something wrong with the class’s API.
内容总结
以上是互联网集市为您收集整理的java – 为什么将变量声明为通配符类型全部内容,希望文章能够帮你解决java – 为什么将变量声明为通配符类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。