2010-12-15 2 views
11

Я хочу представить что-то подобное в моей API:Уплотненный родовое в обобщенном классе

class Foobar extends AbstractThing<Double> 

class EventThing<Foobar> {  
      public Foobar getSource(); 
      public Double getValue(); 
} 

Так что я пишу это:

class EventThing<T extends AbstractThing<U>> {  
     public T getSource(); 
     public U getValue(); 
} 

Но Java не может разрешить U.

С EventThing<T extends AbstractThing<U>,U> вместо этого он работает, но второй U фактически избыточен, потому что AbtractThing определяет тип уже. Поэтому я люблю избавляться от него.

ответ

26

Вы не можете избавиться от него. Второй U не является избыточным. Вы хотите, чтобы компилятор интерпретировал первый U как параметр типа, но это не так. Вы также могли бы написать это:

class EventThing<T extends AbstractThing<Double>> 

Обратите внимание, что Double в данном случае представляет собой конкретный класс, а не параметр типа. Сравните это с следующим:

class EventThing<T extends AbstractThing<U>> 

Обратите внимание, что это имеет ту же форму, что и первая строка кода выше. Как компилятор должен знать, что в первом случае Double понимается как конкретный класс, а во втором случае U понимается как параметр типа?

Компилятор не может этого знать и рассматривает U как конкретный класс, так же как и Double в первой строке. Единственный способ, чтобы компилятор знал, что U является параметр типа, чтобы определить его как таковые:

class EventThing<T extends AbstractThing<U>, U> 
+1

Мне кажется, больше как отсутствующая особенность компилятора. EDIT: Но я получаю вашу точку зрения, спасибо за ответ. Плохо. Я думаю, что я выйду из отверстия. – 2010-12-15 16:31:32

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