当前位置: 首页 > 知识库问答 >
问题:

Java泛型:具有类型参数的多个边界[重复]

空枫涟
2023-03-14

编译以下Java代码:

interface Interface1{}
interface Interface2{}
class MyClass1<T extends Interface1 & Interface2>{}

此外,编译以下代码:

class AClass{}
interface Interface3{}
class MyClass2<T extends AClass & Interface3>{}

以下代码将给我一个编译错误:

interface Interface4 {}
class MyClass3<T, S extends T & Interface4> {}

因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢?

据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。

但是,既然在我的示例Interface是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。

我试图在网上找到答案,但显然我的谷歌搜索技能还不够。我很想了解这里发生了什么。

共有1个答案

平元明
2023-03-14

Java语言规范的第4.4节似乎明确禁止这样做。类型绑定指定为:

TypeBound:
   extends TypeVariable
   extends ClassOrInterfaceType {AdditionalBound}

AdditionalBound:
   & InterfaceType

所以看起来你可以指定一个类型变量(“T”),或者你可以有一个类和接口的列表,但是你不能混合它们。

https://docs.oracle.com/javase/specs/jls/se18/html/jls-4.html#jls-4.4

 类似资料:
  • 在了解Java泛型的过程中,我遇到了以下问题: 假设我有下面的方法来添加列表的元素,只限于包含数字的列表。 但是这段代码和这段代码有什么不同: 它们都按预期编译和执行。这两者之间有什么区别?除了语法之外?什么时候我更喜欢使用通配符而不是前者? 是的,使用通配符方法,我不能在列表中添加除null之外的新元素,否则它将无法编译。除此之外呢?

  • 问题内容: 以下两个签名是否相同? 和 问题答案: 不,两个签名不相同。根据Java语言规范的第8章: 如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。 如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型: 它们具有相同数量的形式参数(可能为零) 它们具有相同数量的类型参数 (可能为零) … 由于两种方法共享的类型参数数量不同,因此签名也不相同。 在实际情况下,使用

  • 问题内容: 我想知道是否有可能编写一个接受多种通用类型的函数,如下所示: 那行得通吗?每个参数中的泛型是否意味着每个参数必须具有与泛型相同的类型T? 问题答案: 是的-可能的(虽然不是使用方法签名),是的,使用签名的类型必须相同。 使用给定的签名,必须在呼叫站点将其与单个类型(例如 或 )相关联。但是,您可以声明采用多个类型参数的方法签名 请注意,在上面的签名中,我已经声明了类型以及签名本身。因此

  • 问题是: 创建一个名为Duo的泛型类,它有两个参数a和B。声明一个名为a类型的第一个变量,以及一个名为B类型的第二个变量。创建一个接受这两个参数的构造函数。在构造函数中,将这些参数分别分配给声明的变量。 这是我能想到的解决方案: 然后,当我继续问下一个问题时,我被绊住了。问题是: 使用问题4中的Duo类声明并创建两个对象,如下所示: a) 第一个名为sideShape的对象分别由字符串类型和整数类

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 我想更好地了解当Java编译器遇到对如下方法的调用时会发生什么。 我很清楚,没有类型