我本周更多地了解了Java Generics。在指定泛型时我学会了有界类型。描述类似于:
class <T extends A & B & C> ...
含义T必须是扩展A并实现B和C的类型。因此,在泛型定义中,类型T的实例可以访问A,B或C中的任何方法。
T可能只扩展一个类,它必须是列表中的第一个类。所有扩展也可以是接口。
这种表示法可能令人困惑。 A是一个班级并不明显。如果你犯了错误并且B是类,编译器不会让你继续,但它没有给出编译时错误信息,这一点特别明显。它没有说明,&#34; B类必须是列表中的第一个。&#34;
我在想Java已经有了定义类和接口的方法。为什么不利用泛型的现有语法。所以而不是:
class <T extends A & B & C>
为什么不:
class <T extends A implements B, C>
答案 0 :(得分:6)
您将泛型类型参数中的extends
关键字与类声明中的extends
关键字以及接口声明中的extends
关键字混淆。
关键字在这些情境中并不意味着相同的事情。
当class
声明显示为class A extends B implements C, D
时,B
必须为class
,而C
和D
必须为interface
{1}}。
当interface
声明显示为interface A extends B, C
时,B
和C
必须为interface
类型。
当通用类型声明显示<A extends B & C & D>
时,B
可以是class
或 interface
,而C
并且D
必须是interface
类型。
正如您所看到的,extends
关键字本身并未指定类型必须是class
还是interface
类型。使用关键字的上下文定义了。
现在,关于为什么他们没有保留现有语法的问题。
他们无法做到,因为如果您将<A extends B & C & D>
更改为<A extends B, C, D>
,则C
和D
对于它们是否是两个独立的参数是不明确的,或者它们是否是A
的附加范围。
问题是参数列表已经使用逗号(,
)来分隔参数,并且在声明多个基本类型时语法已经使用逗号(,
)来分隔它们,所以当你将两者结合起来,最终会出现模糊的语法。
他们必须更改其中一个,因此他们选择使用逗号作为参数分隔符,然后使用&
分隔多个基本类型。
为什么不使用<A extends B implements C & D>
?为什么他们呢? extends
已经可以用来引用类和接口了,所以在这里做它不是&#34; new&#34;。
另请注意,A
本身可以是class
或interface
。由于它是类和接口的通用语法,因此他们为<TYPE extends TYPE & TYPE & TYPE>
选择了简单的通用语法,其中TYPE
为class
或interface
。
答案 1 :(得分:0)
这里一定有些混乱。扩展与工具没有什么不同。不需要实现Java允许用户将类或接口传递给泛型。如果从设计角度思考问题
class <T extends A & B & C>
和
class <T extends A implements B, C>
执行相同的操作,但如果您想将接口作为第一种类型传递,则class <T extends A implements B, C>
会要求您创建新类。使用extends
代替implements
可以在接口和类之间创建可互换的关系,从而实现更好的代码设计。