型変数の上限境界が含意するワイルドカードの上限境界は不要
概要
- C<?> とC<? extends Object> は同じ。(C
の場合) - D<?> とD<? extends Number> は同じ。(D
の場合) - D<?> とD<? extends Object> は同じ。(D
の場合)
確認コード
代入変換で確認。
C<A>とC<B>はAとBが等しくないと互いに代入できないはず。
package test; import java.io.Serializable; public class UnnecessaryUpperBound { /* package private */ static class C<T> {/* */} /* package private */ static class D<T extends Number> {/* */} /* package private */ static class E<T extends Number & Serializable, S> {/* */} @SuppressWarnings("unused") public static void main(final String[] args) { // C<C<? extends Object>> -> C<C<?>> C<C<?>> ccWild = new C<C<? extends Object>>(); // C<C<?>> -> C<C<? extends Object>> C<C<? extends Object>> ccWildObject = new C<C<?>>(); // C<D<? extends Number>> -> C<D<?>> C<D<?>> cdWild = new C<D<? extends Number>>(); // C<D<?>> -> C<D<? extends Number>> C<D<? extends Number>> cdWildNumber = new C<D<?>>(); // C<E<? extends Number, ?>> -> C<E<?, ?>> C<E<?, ?>> ceWild = new C<E<? extends Number, ?>>(); // C<E<?, ?>> -> C<E<? extends Number, ?>> C<E<? extends Number, ?>> ceWildNumber = new C<E<?, ?>>(); // C<D<? extends Object>> -> C<D<?>> Eclipseではダメ C<D<?>> cdWild2 = new C<D<? extends Object>>(); // C<D<?>> -> C<D<? extends Object>> Eclipseではダメ C<D<? extends Object>> cdWildObject2 = new C<D<?>>(); } }
upper boundはupper boundを上限境界と訳すのが心苦しいで書いた通り、上界と訳したいと思っている。