gpt4 book ai didi

java - 为什么 Java 不使用现有的类语言规范语法来进行泛型类型规范?

转载 作者:行者123 更新时间:2023-12-01 21:10:24 24 4
gpt4 key购买 nike

本周我学习了更多有关 Java 泛型的知识。我在指定泛型时了解到了有界类型。描述大致如下:

class <T extends A & B & C> ...

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

T 只能扩展一个类,并且它必须是列表中的第一个。所有扩展也可以是接口(interface)。

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

我认为 Java 已经有一种定义类和接口(interface)的方法了。为什么不利用现有的泛型语法呢?所以代替:

class <T extends A & B & C>

为什么不:

class <T extends A implements B, C>

最佳答案

您混淆了 extends泛型类型参数中的关键字 extends类声明中的关键字,以及 extends接口(interface)声明中的关键字。

关键字在这些上下文中的含义不同。

class声明说class A extends B implements C, D ,然后B必须类型 class ,而CD类型必须为 interface .

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

当泛型类型声明显示 <A extends B & C & D> 时,然后B可以是class interface ,而CD类型必须为 interface .

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

<小时/>

现在,至于你为什么不保留现有语法的问题。

他们不能,因为如果你改变 <A extends B & C & D>进入<A extends B, C, D> ,然后CD关于它们是否是两个独立的参数,或者它们是否是 A 的附加界限是不明确的.

问题是参数列表已经使用逗号 ( , ) 来分隔参数,并且在声明多个基本类型时,语法已经使用逗号 ( , ) 来分隔它们,因此当您组合两者时,你最终会得到不明确的语法。

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

<小时/>

为什么不使用 <A extends B implements C & D> ?他们为什么要这么做? extends已经可以用来引用类和接口(interface),所以让它在这里这样做并不是“新的”。

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

关于java - 为什么 Java 不使用现有的类语言规范语法来进行泛型类型规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48361189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com