Подтвердить что ты не робот

Можете ли вы определить общую границу, которая имеет нижнюю и верхнюю границы?

Можно ли определить общую оценку, которая:

  • реализует интерфейс SomeInterface
  • является суперклассом некоторого класса MyClass

Что-то вроде:

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

Ответ 1

В соответствии с spec ответ будет отсутствовать (у вас могут быть super или extends, но не оба)

 TypeArguments:
    < TypeArgumentList >

TypeArgumentList: 
    TypeArgument
    TypeArgumentList , TypeArgument

TypeArgument:
    ReferenceType
    Wildcard

Wildcard:
    ? WildcardBoundsopt

WildcardBounds:
    extends ReferenceType
    super ReferenceType 

Ответ 2

Вы не можете использовать общий тип (T в вашем случае) с ограничениями при объявлении переменной.

Он должен быть либо подстановочным знаком (?), либо просто использовать полный родовой тип класса.

например.

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