java generics super keyword
我讨论过这些话题
- 仿制药……?超级T
- 用"super"关键字绑定泛型
当我们声明这样的集合时:
1
2
3不应该是相反的吗?我们有一个列表,其中包含一些(未知类型的)对象,这些对象是
Number 的父对象。因此,Object 应该是合适的(因为它是Number 的父母),而Integer 不应该是合适的,相反的情况是有原因的。如果我们有以下代码
1
2
3
4
5
6
7号
编译上述代码是不可能的(我的理智表明这是正确的行为),但基本逻辑可以证明是相反的:
埃多克斯1〔5〕
我知道这很疯狂,但这不是他们不允许
构造的原因吗?如果是,那么为什么允许使用super T> ?List 。- 埃多克斯1〔15〕
- 埃多克斯1〔63〕
- 安吉丽卡·兰格的仿制药常见问题解答
- 什么是有界通配符?
- 我什么时候使用下界的通配符参数化类型?("当具体的参数化类型限制过大时。")
- 为什么类型参数没有下限?(因为它没有意义。)
小精灵
- JLS 5.1.10捕获转换
- 有效Java第二版,项目28:使用有界通配符增加API灵活性
- "PECS代表Producer-
extends ,Consumer-super "。
小精灵
- "PECS代表Producer-
- 太多无法列出,PEC、
new Integer(0) 与valueOf 等 - 通过的名单是一个
List 。List 将起作用Object 与super Number> 相吻合。- 可以将
Number 的任何子类型添加到List 中。 - 即使您也可以在其中添加
String ,您唯一能确定的是您可以添加Number 的任何子类。
小精灵
- 通过的列表是一个
List :List 将起作用Number 与super Number> 相匹配。- 可以将
Number 的任何子类型添加到List 中。
小精灵
- 通过的名单是
List (或Number 的任何子类):List 不起作用- integer是
Number 的一个子类,所以我们要避免它 - 即使
Integer 与Number 相匹配,也不能简称为在List 中添加Number 的任何子类(例如Float )。 super 不是一个子类。
小精灵
- 通过的列表是一个
List (或不扩展Number 的任何类,也不在Number 的"超级层次"中(即Number 和Object 中):List 不起作用String 不符合Number 的"超级层次"- 即使
String 符合Object (这是Number 的一个超类),您也不一定能够将Number 添加到List 中,该List 包含Number 的一个超类中的任何子类。 super 并不表示其中一个超类的任何子类,它只表示其中一个超类。
小精灵
小精灵
不过,我似乎仍然对
有人能帮我恢复这个逻辑链缺失的部分吗?
小精灵
请注意,您可以将cx1〔64〕扩展到上述任何类型。但是,不能将
因此,您不能将
小精灵另请参见
小精灵相关问题
小精灵
对于第一部分,
另一方面,您可以将
第二部分,
如果它是这样工作的,因为每个类都是
小精灵
小精灵
小精灵
小精灵
它是如何工作的?
你可以说,只要你能用你键入的
我没有得到它的一段。许多的答案在这里,和其他专门问题的表演和在某些时候usages是错误的,但不太。。。。。。。。
最后是怎么得到它。如果有一个功能,adds
我宣布我的方法为:
1 | public static void addNumbersToList(List<? extends Number> numbers) |
当时的《来电者可以在一个
1 2 3 4 5 | List<Integer> numbers = new ArrayList<Integer>(); addNumbersToList(numbers); // The following would return a MySuperEfficientNumber not an Integer Integer i = numbers.get(numbers.size()-1) |
很明显,这是不能工作的。和误差会在《
1 | The method add... is not applicable for the arguments (MySuperEfficientNumber) |
因为我可以是任何
1 | The method addNumbersToList(List<? super Number>)... is not applicable for the arguments (List<Integer>) |
我的方法,因为冰说,"我不认为你能做什么
的理由你不能添加一个对象,因为冰的编译器不知道这些类都定义在一般的实际instantiated对象,所以它只允许你两遍数或subtypes of number,双整数的类,所以在线。
让我们说,我们有一个方法,一
或
所以,我可以是通用类型的对象或数据。在两个案例,我们会允许两个数的增加,但只在一个案例,我们会允许两个附加对象。
你必须区分"之间的引用类型和对象的实际类型在这情况。
这样一
本:我认为通用型需求两个
1 2 3 4 5 6 7 8 9 10 11 12 | InputStream mystream = ...; void addTo(List<????> lsb) { lsb.add(new BufferedInputStream(mystream)); } List<BufferedInputStream> lb = new ArrayList<>(); List<InputStream> li = new ArrayList<>(); List<Object> lo = new ArrayList<>(); ... { addTo(lb); addTo(li); addTo(lo); } |
答案:
可以提供一个非常简单的实例。
1 2 | public void add(List<? super Number> list) { } |
这将允许这些保证金
1 | add(new LinkedList<Number>()); |
鸭类数量超过一切
1 | add(new LinkedList<Object>()); |
但无渣槽下面的层次
1 | add(new LinkedList<Double>()); |
或
1 | add(new LinkedList<Integer>()); |
所以既然它不是透明的程序知道不管你给一个号码或战略与对象的编译器不能允许你添加第二个以上的任何信息。
例如,一个表将不接受对象的对象spite大学会接受世界卫生组织的一个号码。但由于这只透明的冰槽将是有效的输入值和它的子类。