2015-05-18 19 views
3

我想用下面的兩個Generic來定義實例變量。是否有可能使用Java中的兩個Generic創建對象?

class Foo<S,T>{ 
    private S<T> Boo ; 
    . 
    . 
} 

public class Test{ 
    public static void main(String[] args){ 
      Foo<ArrayList, String> foo = new Foo<ArrayList, String>();   

    } 
} 

但它不起作用...它有點錯誤的語法嗎?我真的需要這種語法。由於

+2

它怎麼樣不工作? – Zizouz212

+0

不會'S'有'T'的要求,類似於'>''? – MadProgrammer

+0

@ Zizouz212我的猜測是'私人S Boo'。他從來沒有指定一個類型爲'S'的類型參數爲 –

回答

3

也許你需要:

class Foo<S>{ 
    private S Boo ; 
    . 
    . 
} 

public class Test{ 
    public static void main(String[] args){ 
      Foo<ArrayList<String>> foo = new Foo<ArrayList<String>>();   

    } 
} 
+0

謝謝:)這就是我想要的。 – user3595632

+0

順便說一句,我做了這樣一個類:類插槽和它有對象變量'S成員'。在我的構造函數Slot(T組件)中,我定義了這樣的構造:this.member = S();.但它不起作用。我不能這樣做嗎? – user3595632

+0

是的,你不能這樣做, – chengpohi

6

這是無效的語法

S<T> 

因爲對於任何x<T>x必須是一個已知的類或接口類型。

你想要的是一個容器類型和一個元素類型。這是可能的

class Foo<C extends Collection<E>, E>{ 
    private C boo; 

... 

Foo<ArrayList<String>, String> foo = new Foo<>(); 
+0

如果C是我自己創建的類,那麼該怎麼辦呢?我的意思不是'ArrayList',而是'Moo'類 – user3595632

0

這是行不通的,因爲ArrayList有它自己的參數,當你不指定它,它會被當作ArrayList中。

因此,您的代碼將被視爲private ArrayList<Object><String>,這是無效的。

對於這樣的情況下,你只需指定ArrayList<String>,有你的定義是這樣的:如果你想放置在T約束

class Foo<S>{ 
    private S Boo ; 
    . 
    . 
} 

public class Test{ 
    public static void main(String[] args){ 
      Foo<ArrayList, String> foo = new Foo<ArrayList<String>>();   

    } 
} 

S你能做到這樣:

class Foo<S extends Collection<T>, T extends Comparable<T>> { 
    private S Boo; 
} 

但你不能這樣做

class Foo<S<T>, T extends Comparable<T>> { 
    private S Boo; 
} 
相關問題