外卡和泛型类/方法声明的不同策略。为什么?

时间:2014-06-14 16:02:48

标签: java generics wildcard type-erasure

我已经阅读了很多信息泛型,我已经了解了很多新信息。但我有一些误解。

Misunderstaning#1

可以

class MyClass <T extends Number>{}

我可以写:

List<? super Number> list;

我也可以写:

List<? extends Number> list;

但我不能

class MyClass <T super Number>{}

Misunderstaning#2

我可以写

class MyClass <T extends Number & Comparable>{}

但我不能写

List<? extends Number & Comparable> list;

你能解释为什么这些变种被禁止了吗?

P.S。 我已阅读相关主题,但我找不到答案。我从java文档中读过引文,但我不明白真正的原因

1 个答案:

答案 0 :(得分:1)

现在,我不能说我能就这些问题提供权威的答案,但(大部分)这些界限对我来说都是有道理的。

T extends Number有效,因为无论T是什么,您都有一些由边界提供的保证行为/方法 - 在这种情况下,保证T有一些方法由Number定义,因此无论何时使用T对象,您都知道它支持一些方法。

? extends Number的工作方式类似于T extends Number,除非您不关心?是什么,因为您从不直接处理代码中的这些对象,所以如果精确类型就可以了是“迷失”。

? super Number没关系,因为你从来没有真正处理完全 ?所代表的类型,所以?的行为并不是真的重要。据我所知,它只是用于消费者,你真正关心的是方法/类型总能处理任何类型达到下限的对象。

但是T super Number有点无意义,因为现在你可以处理T类型的对象,并且可以保证的唯一行为是 Object ,因为T可以是ObjectSerializableNumber - 而且您实际上没有任何一致性编译器可以关闭的那些类型的行为集。所以不允许这样做,因为它增加了零利益的复杂性。

(我在这里使用的是“行为”,但我认为它意味着接近“可用方法”)


再次,

T extends Number & Comparable是正常的,因为您正在处理T个对象,并且边界可以保证T的行为方式。

现在,? extends Number & Comparable有点棘手。我不能直观地说,为什么不允许这样做。有this答案(我觉得你很难理解),这让我觉得它只是Java的一个限制。 This回答还支持这样一种观点,即它不仅仅是理论上的Java限制。

所以最后,我认为? extends Number & Comparable是唯一对我没有意义的不允许的界限。也许我会在某个时候开悟,此时我会记得回来更新这个。但至少就我现在所读到的而言,这似乎只是一个设计决定/限制。