是否可以定义一个通用绑定:
SomeInterface
MyClass
类似的东西:
Collection<? extends SomeInterface & super MyClass> c; // doesn't compile
答案 0 :(得分:3)
根据spec,答案是否定的(您可以super
或extends
,但不能同时使用{}
TypeArguments: < TypeArgumentList > TypeArgumentList: TypeArgument TypeArgumentList , TypeArgument TypeArgument: ReferenceType Wildcard Wildcard: ? WildcardBoundsopt WildcardBounds: extends ReferenceType super ReferenceType
答案 1 :(得分:2)
在声明变量时,不能使用泛型类型(在您的情况下为T
)。
它应该是通配符(?
),或者只使用该类的完整泛型类型。
E.g。
// Here only extends is allowed
class My< T extends SomeInterface >
{
// If using T, then no bounds are allowed
private Collection<T> var1;
private Collection< ? extends SomeInterface > var2;
// Cannot have extends and super on the same wildcard declaration
private Collection< ? super MyClass > var3;
// You can use T as a bound for wildcard
private Collection< ? super T > var4;
private Collection< ? extends T > var5;
}
在某些情况下,您可以通过向类(或方法)添加额外的泛型参数并在该特定参数上添加绑定来收紧声明:
class My <
T extends MyClass< I >,
I extends SomeInterface
>
{
}