枚举<有区别吗?扩展ZipEntry >和枚举<ZipEntry>?如果是这样,有什么区别?枚举之间的区别<?扩展ZipEntry>和枚举<ZipEntry>?
9
A
回答
16
因为类型参数仅用于“输出”位置,所以当您获得其中一个时,您可以执行的操作没有实际区别。另一方面,你可以使用作为其中之一。
假设你有一个Enumeration<JarEntry>
- 你不能把它传递给一个以Enumeration<ZipEntry>
为参数的方法。你可能把它传递给一个采取Enumeration<? extends ZipEntry>
虽然。
当你有一个在输入和输出位置都使用type参数的类型时更有趣 - List<T>
是最明显的例子。以下是三个参数变化的方法示例。在每种情况下,我们都会尝试从列表中获取一个项目,然后再添加一个项目。
// Very strict - only a genuine List<T> will do
public void Foo(List<T> list)
{
T element = list.get(0); // Valid
list.add(element); // Valid
}
// Lax in one way: allows any List that's a List of a type
// derived from T.
public void Foo(List<? extends T> list)
{
T element = list.get(0); // Valid
// Invalid - this could be a list of a different type.
// We don't want to add an Object to a List<String>
list.add(element);
}
// Lax in the other way: allows any List that's a List of a type
// upwards in T's inheritance hierarchy
public void Foo(List<? super T> list)
{
// Invalid - we could be asking a List<Object> for a String.
T element = list.get(0);
// Valid (assuming we get the element from somewhere)
// the list must accept a new element of type T
list.add(element);
}
欲了解更多详情,请阅读:
4
是,直接从sun generics tutorials之一:
这里Shape是一个抽象类 三个子类:Circle,Rectangle, 和Triangle。
public void draw(List<Shape> shape) { for(Shape s: shape) { s.draw(this); } }
值得注意的是,平局() 方法只能在 形状的列表来调用,不能在列表上叫做圆形,矩形,三角形和对 例如 。为了让方法 接受任何类型的形状,它应该是 写成如下:
public void draw(List<? extends Shape> shape) { // rest of the code is the same }
0
现在你刚刚走了,提醒我的东西,我希望我们在C#全球已经有超过。
除了链接提供的,有关于C#和Java中关系在回答这个问题的一些好的链接到这个话题:Logic and its application to Collections.Generic and inheritance
的选择,其中包括:
- Contravariance and Covariance in C#(代码是C#特有的,并且由于语法不存在,所以理论上还不够],但一般涵盖的主题非常好。)
- Java generics and the covariance and contravariance of arguments
- Java generics tutorial fr om Sun.
相关问题
- 1. 枚举和枚举之间的区别
- 2. Java枚举:列出Class <?中的枚举值扩展枚举>
- 3. 枚举结构内: '之间' 和“枚举<anonymous>
- 4. scala和java枚举之间的区别
- 5. 扩展枚举?
- 6. “扩展”枚举
- 7. 扩展枚举
- 8. 扩展枚举
- 9. java中枚举数与枚举之间的区别
- 10. #define枚举或如何扩展枚举
- 11. Java:从枚举枚举<String>
- 12. 枚举<>枚举差异
- 13. 如何区分标志枚举和普通枚举之间的区别?
- 14. 扩展枚举类
- 15. 扩展和枚举常量
- 16. 扩展和枚举类型
- 17. 如何检测使用libclang的枚举和范围枚举之间的区别?
- 18. 枚举:使用枚举和类与静态变量之间的区别
- 19. '枚举:类型'和简单'枚举'之间的区别是什么
- 20. 从类<?获取枚举实例扩展枚举>使用字符串值?
- 21. 转换枚举<String>来枚举<object>
- 22. 枚举Objective-C和“<<”操作符
- 23. 标志和<<枚举操作? C#
- 24. 使用'枚举'和'枚举'的原因<Type>'
- 25. 可扩展的枚举Java
- 26. Java:特定枚举和泛型枚举<?>参数
- 27. 扩展.NET MembershipCreateStatus枚举
- 28. Java可扩展枚举
- 29. 可扩展枚举计划
- 30. 扩展枚举在C#
一个ZipEntrySubclass像JarEntry(ZipFile.entries使用通配符的原因)? – 2009-03-06 11:35:21
谢谢汤姆 - 将编辑我的答案:) – 2009-03-06 11:56:55