2016-03-30 8 views
1

次のJavaコードを考える:Testクラスのmainメソッドでネストされたワイルドカードのジェネリック変数気取り

public class Test { 
    public static class A<T> { 
     private T t; 

     public A(T t) { 
      this.t = t; 
     } 

     public T getT() { 
      return t; 
     } 

     public void setT(T t) { 
      this.t = t; 
     } 
    } 

    public static class B<T> { 
     private T t; 

     public B(T t) { 
      this.t = t; 
     } 

     public T getT() { 
      return t; 
     } 

     public void setT(T t) { 
      this.t = t; 
     } 
    } 

    public static class F<T> { 
     private T t; 

     public F(T t) { 
      this.t = t; 
     } 

     public A<B<T>> construct() { 
      return new A<>(new B<>(t)); 
     } 

     public T getT() { 
      return t; 
     } 

     public void setT(T t) { 
      this.t = t; 
     } 
    } 

    public static void main(String[] args) { 
     F<?> f = new F<>(0); 
     // 1: KO 
     // A<B<?>> a = f.construct(); 
     // 2: KO 
     // A<B<Object>> a = f.construct(); 
     // 3: OK 
     // A<?> a = f.construct(); 
    } 
} 

を、​​の結果を受け取る変数の正しい種類は何ですか? このタイプはA<B<...>>のようになります。...は私が探しているものです。

上記の3つのコメント行が、この問題を解決しようとしています。 1行目と2行目が無効です。 3番目はBタイプの情報ですが、私はキャストする必要があります。a.getT()です。

+1

なぜ、 'F f = new F <>(0);' – Tunaki

+0

の代わりに 'F f = new F <>(0);'を使用していますか? 'F 'のインスタンスに影響されました。 –

+0

引数として0を渡しています。これは 'int'です。 – Tunaki

答えて

1

A<? extends B<?>> a = f.construct();は、Paul Boddingtonが述べたように正しい構文です。

関連する問題