8

我有实现 MyInterface 的枚举。在使用该枚举创建其他类时,我想将 enumClz 限制为已实现 MyInterface 的类。

T extends Enum< T extends MyInterface>所以我在泛型类型声明中将签名描述为“ ”。

public <T extends Enum< T extends MyInterface>> C1( Class<T> enumClz) {
    for (T anEnumConst : enumClz.getEnumConstants()) {
        //....process
    }
}

令我惊讶的是 IDE 说它在“”处是“意外绑定” T extends MyInterface。我不知道这样两个字的错误信息是什么意思,有什么解决办法吗?


顺便说一句,出于好奇,我有一个奇怪的问题,虽然不是很重要。一个枚举类型T能否等价于下面的无限循环

<T extends Enum< T extends Enum<T extends<....>>>> ?

4

1 回答 1

10

改为声明以下内容:

public <T extends Enum<T> & MyInterface> C1(Class<T> enumClz)

在这里,我们声明T有多个上限,这对于类型参数是可能的。

该声明<T extends Enum<T extends MyInterface>>是无效的语法,因为T必须与具体类型绑定,但T extends MyInterface类型参数中的 forEnum试图添加有关T何时已声明的更多信息。

另请注意,在声明多个边界时,类类型必须始终放在首位。的声明<T extends MyInterface & Enum<T>>也是无效的语法。

顺便说一句,出于好奇,我有一个奇怪的问题,虽然不是很重要。一个枚举类型T能否等价于下面的无限循环

<T extends Enum< T extends Enum<T extends<....>>>>?

声明T extends Enum<T>已经是“无限的”,因为它是递归的。所声明的相同T作为其上限的类型参数给出 - 类型参数的范围包括它自己的声明。

更多信息:

于 2013-10-29T04:14:51.297 回答