Можете ли вы определить общую границу, которая имеет нижнюю и верхнюю границы?
Можно ли определить общую оценку, которая:
- реализует интерфейс
SomeInterface
- является суперклассом некоторого класса
MyClass
Что-то вроде:
Collection<? extends SomeInterface & super MyClass> c; // doesn't compile
Ответы
Ответ 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
>
{
}