是否可以使用Java中的两个Generic创建对象?

时间:2015-05-18 01:00:04

标签: java generics

我想使用两个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>();          

    }
}

但它不起作用......它是不是有点错误的语法?我真的需要这种语法。感谢

3 个答案:

答案 0 :(得分:6)

这是无效的语法

S<T>

因为对于任何x<T>x必须是已知的类或接口类型。

您想要的是容器类型和元素类型。这是可能的

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

...

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

答案 1 :(得分:3)

也许你需要:

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

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

    }
}

答案 2 :(得分:0)

由于ArrayList拥有自己的参数,因此无法正常工作,当您不指定它时,它将被视为ArrayList。

因此,您的代码将被视为无效的private ArrayList<Object><String>

对于这类情况,您只需指定ArrayList<String>并按照以下定义:

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

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

    }
}

如果您想在TS上设置约束,可以这样做:

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

但你无法做到

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