为什么Java不使用现有的类语言规范语法来表示泛型类型规范?

Jim*_*ine 2 java generics

本周我对Java Generics有了更多的了解.在指定泛型时我学会了有界类型.描述的内容如下:

class <T extends A & B & C> ...
Run Code Online (Sandbox Code Playgroud)

含义T必须是扩展A并实现B和C的类型.因此,在泛型定义中,类型T的实例可以访问A,B或C的任何方法.

T可能只扩展一个类,它必须是列表中的第一个类.所有扩展也可以是接口.

这种表示法可能令人困惑.A是一个阶级并不明显.如果你犯了错误并且B是类,编译器将不会让你继续,但它不会给出一个特别明显的编译时错误消息.它没有声明,"B类必须是列表中的第一个."

我以为Java已经有了定义类和接口的方法.为什么不利用泛型的现有语法.所以代替:

class <T extends A & B & C>
Run Code Online (Sandbox Code Playgroud)

为什么不:

class <T extends A implements B, C>
Run Code Online (Sandbox Code Playgroud)

And*_*eas 6

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

关键字在这些上下文中并不意味着相同的事情.

当一个class声明说class A extends B implements C, D,那么B必须是类型class,C而且D必须是类型interface.

当一个interface声明说interface A extends B, C,然后BC类型必须为interface.

当泛型类型声明出现时<A extends B & C & D>,则B可以是a class an interface,while CD必须是type interface.

如您所见,extends关键字本身并不指定类型是否必须是类型classinterface.使用关键字的上下文定义了这一点.


现在,关于为什么他们没有保留现有语法的问题.

他们不能,因为如果你改变<A extends B & C & D><A extends B, C, D>,然后CD是模糊的,他们是否是两个独立的参数,或者它们是否额外的边界来A.

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

他们不得不更改其中一个,因此他们选择使用逗号作为参数分隔符,然后使用它&来分隔多个基类型.


为什么不使用<A extends B implements C & D>?为什么他们呢?extends已经可以用来引用类和接口,所以让它在这里做的不是"新的".

还要记住,A它本身可以是一个class或一个interface.由于它是类和接口的通用语法,因此它们选择简单的通用语法<TYPE extends TYPE & TYPE & TYPE>,其中TYPEis classinterface.