在Java中,声明变量a Set
与Set<Object>
之间有什么区别?两者不应该相等吗?为Set
指定Set<Object>
变量时为什么会出现编译时错误?Java泛型:集与集<Object>
1
A
回答
1
编号:Set<>
是通用名称,Set
不是。从逻辑上讲,Set<Object>
可能相当于Set
(隐式,Set of Object
),但字节码是完全不同的:)
建议:
运行在你的示例程序javap
命令并验证自己这一点。
1
它是Java 1.4及以下和1.5以上的区别。
有很多关于为什么的信息。
http://download.oracle.com/javase/1,5.0/docs/guide/language/generics.html
3
这不是一个编译时错误。这只是一个警告。即该编译罚款:
Set s = new HashSet();
Set<Object> so = new HashSet<Object>();
s = so;
顺便一提,所以不会
so = s;
而且他们基本上都是从使用的角度相同。
0
这两者不等价。当您指定Set<Object>
时,您可以提高编译器检测集合的不安全操作的能力,否则这些操作在运行时会失败。
这是覆盖在乔希布洛赫的优秀Effective Java, Second Edition,从这个例子是无耻的启发:
public static void main(String[] args) {
List<String> typesafeStrings = new ArrayList<String>();
unsafeAdd(typesafeStrings, new Integer(0)); // can add a Integer to a List<String>!
String s = typesafeStrings.get(0); // fails at runtime, not safe
typesafeStrings = new ArrayList<String>();
safeAdd(typesafeStrings, new Integer(0)); // compiler error, safe!
s = typesafeStrings.get(0);
}
static void unsafeAdd(List list, Object o) {
list.add(o);
}
static void safeAdd(List<Object> list, Object o) {
list.add(o);
}
2
这里就是不等价...
Set<String> s_str = new HashSet<String>();
Set s_plain = s_str; // This is valid, although you will get a compiler warning
// This is invalid, the Set<String> cannot be implicitly cast to object even though
// it's *contents* are all objects.
Set<Object> s_obj = s_str;
现在让我们假设你想必须将一个通用Set作为参数传递给一个函数。您可以使用扩展
function void foo(Set<? extends Object> s) {}
在这种情况下,一个Set
,一个Set<Object>
和Set<String>
可以在所有的功能被传递,虽然他们都是不同的。
相关问题
- 1. Java泛型和集合集
- 2. 泛型与集合
- 3. Java 8泛型集合与可选项
- 4. Java泛型集合怀疑
- 5. 嵌套Java集合泛型
- 6. Java泛型和集合
- 7. Java的泛型集合
- 8. C#与泛型集合类
- 9. 泛型集合
- 10. Java - 泛型类型和集合
- 11. 泛型类型的GSON(Java集合)
- 12. Laravel泛型集合
- 13. 泛型集合MVC
- 14. 上泛型集合
- 15. Java:与泛型和收集类型检测问题
- 16. 具有@NonNull与集合的返回类型的Java泛型
- 17. Typescript泛型回调类型提示与泛型集合
- 18. Java泛型集合和继承
- 19. Java泛型和集合阅读Refrences
- 20. Java泛型总是用于收集
- 21. GSON - 反序列化java泛型集合
- 22. 使用Java泛型解析XML(集合)
- 23. 关于Java集合和泛型:
- 24. 泛型集合和通配符的Java
- 25. Java泛型和收集分配
- 26. Java 8分组通过泛型集合
- 27. 在java中混合泛型和非泛型集合
- 28. 集合泛型类型
- 29. 有没有包装非泛型集合的泛型集合库?
- 30. 从泛型集合到非泛型集合
你应该也许可以解决你的问题 – marc