你能定义一个具有下限和上限的泛型边界吗?

时间:2013-01-02 20:17:57

标签: java generics

是否可以定义一个通用绑定:

  • 实现了接口SomeInterface
  • 是某个类MyClass
  • 的超类

类似的东西:

Collection<? extends SomeInterface & super MyClass> c; // doesn't compile

2 个答案:

答案 0 :(得分:3)

根据spec,答案是否定的(您可以superextends,但不能同时使用{}

 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 
>
{
}