"Set>" на самом деле?

Я использовал небольшой универсальный метод для создания множеств из vararg элементов, например

public <T> Set<T> createSet( T... elements ) { ...

Однако недавно я столкнулся с ситуацией, когда компилятор не сделал то, что я ожидал. Из следующих createSet() использует только s3 works.

Set<Class<? extends Throwable>> s1 = createSet( Exception.class, RuntimeException.class );

Set<? extends Class<Throwable>> s2 = createSet( Exception.class, RuntimeException.class );

Set<? extends Class<? extends Throwable>> s3 = createSet( Exception.class, RuntimeException.class );

Может ли кто-нибудь дать четкое объяснение того, почему s3 работает и что может быть не так с моим мышлением относительно s1 - который был моим первоначальным кодированием? Спасибо.

18
задан Robert Munteanu 2 November 2011 в 15:46
поделиться