[英]Java generics to assign global variables
在此示例中,我得到警告“列表是原始类型”。 如何使用泛型正确满足此警告? 我遇到了麻烦,因为我不知道如何像为构造函数签名那样为全局变量定义“ T”。
public class MyClass{
private List input;
public <T extends Comparable<T>> MyClass(List<T> input){
this.input = input;
}
}
您必须将类定义为参数化
public class MyClass<T extends Comparable<T>>{
private List<T> input;
public MyClass(List<T> input){
this.input = input;
}
}
“原始类型”是指没有特定泛型参数类型的泛型类型。 在这种情况下,这是因为您在input
的声明中省略了泛型类型。 将声明更改为:
private List<T> input;
应该解决错误。 此外,您的构造函数声明不需要通用参数,可以缩短为:
public MyClass(List<T> input){
this.input = input;
}
您可能需要执行以下操作:
public class MyClass<T> {
private List<T> input;
}
如您所见,问题是由使用不带通用参数的List
成员变量input
引起的。 因此,该类型被“原始”使用。 要解决此问题,您有三个选择。 您可以:
使您的整个班级通用
public class MyClass<T extends Comparable<T>> { private List<T> input; public MyClass(List<T> input) { this.input = input; } }
要么
使用通配符
private List<? extends Comparable<T>> input;
要么
重新考虑您的策略
public class MyClass { private List<Comparable<T>> input; public <T extends Comparable<T>> MyClass(List<T> input) { this.input = new LinkedList<>(); // Obv. there are better ways of copying a list... for (Comparable<T> obj : input) { this.input.add(obj); } } }
我建议选择1或3。
我相信您的问题是您说private List input;
,则无需为要查找的通用类型设置任何参数。 您可以通过说private List<T> input;
来解决它private List<T> input;
您可以使该类通用。
public class MyClass<T extends Comparable<T>> {
private final List<T> input;
public MyClass(Collection<? extends T> input){
this.input = new ArrayList<T>(input);
}
}
我还更改了this.input = input
以代替复制input
。 这确实非常重要,因为否则任何引用input
都可以通过修改input
来修改您的类。 通过允许T
的任何子类型的任何Collection
,我还使您的构造函数更加灵活。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.