本周我对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)
您将extends泛型类型参数中的extends关键字与类声明中的extends关键字以及接口声明中的关键字混淆.
关键字在这些上下文中并不意味着相同的事情.
当一个class声明说class A extends B implements C, D,那么B必须是类型class,C而且D必须是类型interface.
当一个interface声明说interface A extends B, C,然后B和C类型必须为interface.
当泛型类型声明出现时<A extends B & C & D>,则B可以是a class 或 an interface,while C且D必须是type interface.
如您所见,extends关键字本身并不指定类型是否必须是类型class或interface.使用关键字的上下文定义了这一点.
现在,关于为什么他们没有保留现有语法的问题.
他们不能,因为如果你改变<A extends B & C & D>成<A extends B, C, D>,然后C和D是模糊的,他们是否是两个独立的参数,或者它们是否额外的边界来A.
问题是参数列表已经使用逗号(,)来分隔参数,并且在声明多个基类型时,语法已经使用逗号(,)来分隔它们,因此当您将两者结合使用时,最终会出现模糊的语法.
他们不得不更改其中一个,因此他们选择使用逗号作为参数分隔符,然后使用它&来分隔多个基类型.
为什么不使用<A extends B implements C & D>?为什么他们呢?extends已经可以用来引用类和接口,所以让它在这里做的不是"新的".
还要记住,A它本身可以是一个class或一个interface.由于它是类和接口的通用语法,因此它们选择简单的通用语法<TYPE extends TYPE & TYPE & TYPE>,其中TYPEis class或interface.
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |