2013-06-03 3 views
3

Я пытался использовать некоторые Generics и заметил это.поведение дженериков Java для ограниченных подстановочных знаков

class D extends C {} 

class C extends B {} 

class B extends A {} 

class A {} 

class Z<E extends B> {} 

class temp { 

public static void main(String[] args) { 
    Z z1 = new Z(); 
    Z<B> z2 = new Z<B>(); 
    Z<C> z3 = new Z<C>(); 
    Z<D> z4 = new Z<D>(); 
    Z<A> z5 = new Z<A>(); //compile error - E can be subsituted only until B 
    Z<? extends A> z5 = null; //no compile error 
    } 
} 

Почему это не вызывает ошибку компиляции?

Z<? extends A> z5 = null; 

Класс Z имеет верхнюю границу до B, и все же я могу иметь подстановочную декларацию, которая не проходит до А. Конечно, я не могу создать его экземпляр в

Z<? extends A> z5 = new Z<A>(); //Not allowed 

, но не должно это были ошибки компиляции? Почему это разрешено?

EDIT: исправлен экземпляр Z5

ответ

3

Я думаю, что один из способов смотреть на то, что вы спрашиваете, должны Java позволяют писать

Z<?> z; 

В целом, следует Java позволяет любого общий тип, который будет использоваться с неограниченным шаблоном. Если вы считаете, что ответ «да», и я так думаю, тогда у вас есть свой ответ.

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