我已经阅读了很多信息泛型,我已经了解了很多新信息。但我有一些误解。
我可以写
class MyClass <T extends Number>{}
我可以写:
List<? super Number> list;
我也可以写:
List<? extends Number> list;
但我不能写
class MyClass <T super Number>{}
我可以写
class MyClass <T extends Number & Comparable>{}
但我不能写
List<? extends Number & Comparable> list;
你能解释为什么这些变种被禁止了吗?
P.S。 我已阅读相关主题,但我找不到答案。我从java文档中读过引文,但我不明白真正的原因
答案 0 :(得分:1)
现在,我不能说我能就这些问题提供权威的答案,但(大部分)这些界限对我来说都是有道理的。
T extends Number
有效,因为无论T
是什么,您都有一些由边界提供的保证行为/方法 - 在这种情况下,保证T
有一些方法由Number
定义,因此无论何时使用T
对象,您都知道它支持一些方法。
? extends Number
的工作方式类似于T extends Number
,除非您不关心?
是什么,因为您从不直接处理代码中的这些对象,所以如果精确类型就可以了是“迷失”。
? super Number
没关系,因为你从来没有真正处理完全 ?
所代表的类型,所以?
的行为并不是真的重要。据我所知,它只是用于消费者,你真正关心的是方法/类型总能处理任何类型达到下限的对象。
但是T super Number
有点无意义,因为现在你可以处理T
类型的对象,并且可以保证的唯一行为是 Object
,因为T
可以是Object
,Serializable
或Number
- 而且您实际上没有任何一致性编译器可以关闭的那些类型的行为集。所以不允许这样做,因为它增加了零利益的复杂性。
(我在这里使用的是“行为”,但我认为它意味着接近“可用方法”)
T extends Number & Comparable
是正常的,因为您正在处理T
个对象,并且边界可以保证T
的行为方式。
现在,? extends Number & Comparable
有点棘手。我不能直观地说,为什么不允许这样做。有this答案(我觉得你很难理解),这让我觉得它只是Java的一个限制。 This回答还支持这样一种观点,即它不仅仅是理论上的Java限制。
所以最后,我认为? extends Number & Comparable
是唯一对我没有意义的不允许的界限。也许我会在某个时候开悟,此时我会记得回来更新这个。但至少就我现在所读到的而言,这似乎只是一个设计决定/限制。