我想使用两个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>();
}
}
但它不起作用......它是不是有点错误的语法?我真的需要这种语法。感谢
答案 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>>();
}
}
如果您想在T
和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;
}