2016-03-30 7 views
1

Angesichts der folgenden Java-Code:Nested Wildcard Generika Variable Affektiertheit

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(); 
    } 
} 

Im Hauptverfahren der Test Klasse, was ist der richtige Typ einer Variablen, die das Ergebnis der f.construct() erhalten? Dieser Typ sollte etwas wie A<B<...>> sein, wo ... ist, was ich suche.

Es gibt 3 kommentierte Zeilen Code oben, die meine Versuche darstellen, dieses Problem zu lösen. Die ersten und zweiten Zeilen sind nicht gültig. Die dritte ist, aber ich verliere die B Art Informationen und ich muss a.getT() werfen.

+1

Warum verwenden Sie 'F f = new F <> (0);' statt, zum Beispiel 'F f = new F <> (0);' – Tunaki

+0

Weil 'f' wird nicht immer betroffen mit Instanzen von 'F '. –

+0

Sie übergeben 0 als Argument. Was ist ein 'int'? – Tunaki

Antwort

1

A<? extends B<?>> a = f.construct(); ist die richtige Syntax, wie von Paul Boddington angegeben.