型変数の上限境界が含意するワイルドカードの上限境界は不要

概要

  • C<?> とC<? extends Object> は同じ。(Cの場合)
  • D<?> とD<? extends Number> は同じ。(Dの場合)
  • D<?> とD<? extends Object> は同じ。(Dの場合)

ただし、3つめはEclipseコンパイラではダメだった。

確認コード

代入変換で確認。
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を上限境界と訳すのが心苦しいで書いた通り、上界と訳したいと思っている。