2017-10-09 47 views
-2

我想知道是否有可能創建一個是通用型與同類型的類它包含在的對象。實例化一個泛型類型的對象與同一類型作爲它的超

例如,考慮這個對象

public class Foo<T> { 

    private T variable; 

    Foo() { 

    } 
} 

現在考慮這個

public class Bar<T> { 

    private Foo foo; 

    Bar() { 
     foo = (T) new Foo(); 
    } 
} 

我想酒吧類中的Foo對象的數據類型是相同的數據類型欄instantiat編輯爲。

+2

這很雜亂。第二個例子,你試圖將'Foo'實例賦值給'T'類變量?這是行不通的。請修改您的示例/問題 –

+3

'new Foo();' - 您正在使用不存在的無參數構造函數,並且您正在實例化一個原始類型。目前還不清楚你想要做什麼。 – Eran

回答

0

Foo中的構造函數需要一個參數;但你可以這樣做:

public class Bar<T> { 

    private Foo<T> foo; 

    Bar(T x) { 
     foo = new Foo<T>(x); 
    } 
} 
-1

我不確定我是否正確理解你,但是你想要這樣的東西嗎?

 public class Bar<T> extends Foo<T> { 

      private Foo<T> foo; 

      Bar() { 
       foo = new Foo<T>(); 
      } 
     } 
+0

在回答問題之前,請提出一個明確的問題!這裏沒有人能讀懂你的想法。 – Duke

0

是的,你可以這樣做,它會工作。但是你需要有正確的開發構造函數來處理數據類型。

程序的輸出是:

class java.lang.Integer 
class java.lang.String 

正如你可以看到FOO變量的數據類型是一樣的酒吧對象的數據類型。

而你在程序中犯了一個錯誤,在Bar類中應該有一個重載的構造函數。

package test; 

public class test { 

    public static void main(String[] args) { 
     Bar<Foo> integerBar = new Bar(3); 
     Foo<Integer> fooIntegerObject = (Foo) integerBar.getFoo(); 

     Bar<Foo> stringBar = new Bar("hello"); 
     Foo<String> fooStringObject = (Foo) stringBar.getFoo(); 

     System.out.println(fooIntegerObject.getVariable().getClass()); 
     System.out.println(fooStringObject.getVariable().getClass()); 

    } 
} 

class Foo<T> { 

    private T variable; 

    Foo(T x) { 
     variable = x; 
    } 
    public T getVariable() { 
     return variable; 
    } 

} 

class Bar<T> { 

    private T foo; 

    Bar(T x) { 
     foo = (T) new Foo<T>(x); 
    } 
    public T getFoo() { 
     return foo; 
    } 

} 
0

基於更新後的問題,下面的工作:

class Bar<T extends Foo<T>> { 
    private Foo<T> foo; 

    Bar() { 
     foo = new Foo<T>(); 
    } 
} 

注意,你不應該使用原始類型Foo

相關問題