为什么Java没有将现有的类语言规范语法用于泛型类型规范?

时间:2018-01-20 21:16:55

标签: java generics

我本周更多地了解了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>

2 个答案:

答案 0 :(得分:6)

您将泛型类型参数中的extends关键字与类声明中的extends关键字以及接口声明中的extends关键字混淆。

关键字在这些情境中并不意味着相同的事情。

class声明显示为class A extends B implements C, D时,B必须为class,而CD必须为interface {1}}。

interface声明显示为interface A extends B, C时,BC必须为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>,则CD对于它们是否是两个独立的参数是不明确的,或者它们是否是A的附加范围。

问题是参数列表已经使用逗号(,)来分隔参数,并且在声明多个基本类型时语法已经使用逗号(,)来分隔它们,所以当你将两者结合起来,最终会出现模糊的语法。

他们必须更改其中一个,因此他们选择使用逗号作为参数分隔符,然后使用&分隔多个基本类型。

为什么不使用<A extends B implements C & D>?为什么他们呢? extends已经可以用来引用类和接口了,所以在这里做它不是&#34; new&#34;。

另请注意,A本身可以是classinterface。由于它是类和接口的通用语法,因此他们为<TYPE extends TYPE & TYPE & TYPE>选择了简单的通用语法,其中TYPEclassinterface

答案 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可以在接口和类之间创建可互换的关系,从而实现更好的代码设计。