2015-03-05 3 views

ответ

31

Как уже отмечалось, это:

class MyOtherClass <T extends OtherInterface & SomeInterface> 

определяет многократно ограниченный тип параметра. Если вы используете MyOtherClass, вы должны указать ему тип, который реализует как OtherInterface, так и SomeInterface.

Однако это делает не определить многократно ограниченный тип параметра:

class MyClass <T extends OtherInterface, SomeInterface> 

Он определяет общий с двумя параметрами типа. Первый должен реализовать OtherInterface. Второй может быть любым. Это так же, как

class MyClass <T extends OtherInterface, U> 

за исключением того, что вы назвали его SomeInterface вместо U. (Соглашение состоит в том, что параметры типа обычно представляют собой одиночные буквы верхнего регистра, или иногда буквы верхнего регистра, а также цифру или короткий идентификатор верхнего регистра. Но компилятору все равно. Он не будет смотреть на форму идентификатор, чтобы понять, что вы на самом деле означали его как интерфейс.)

2

нашел это правила:

Несколько Bounds

В предыдущем примере показано использование параметра типа с одним прыжком, но параметр типа может иметь несколько границ:

Тип переменной с несколькими ограничениями является подтипом всех типов, перечисленных в ссылке. Если одна из границ является классом, она должна быть указана первыми. Например:

Class A { /* ... */ } 
interface B { /* ... */ } 
interface C { /* ... */ } 

class D <T extends A & B & C> { /* ... */ } 

Если привязали не указан первым, вы получите ошибку компиляции:

class D <T extends B & A & C> { /* ... */ } // compile-time error 
2

Несколько Bounds возможны с <T extends B1 & B2 & B3> где B2 и B3 должны быть интерфейсом. B1 может быть простым классом или интерфейсом

1

Запятые и амперсанды в определении типа связаны между собой разными вещами.

Амперсанд означает, что ваш параметр типа является подтипом всех границ параметров типа, соединенных '&'; как и следовало ожидать, список ограничений параметров типа должен соответствовать правилам множественного наследования Java, т. е. не более одного класса, разрешено несколько интерфейсов.

запятая является разделителем для границ типа захваченных - так в вашем примере, это означает, что у вас есть два отдельных аргументы типа - Т распространяется OtherInterface и SomeInterface, так что вы должны были бы использовать его как:

new MyClass<OtherInterfaceSubtype, SomeInterfaceSubType>(); 

Я предполагаю, что это не то, что вы хотите.

+1

Обратите внимание, что в приведенном примере, 'class MyClass ', OP определил два общих параметра. Первый называется 'T' и связан с' OtherInterface', а второй (смутно) называется 'SomeInterface' и неограничен (поэтому' SomeInterface' действительно может быть любым классом!) – yshavit

Смежные вопросы