在此示例中,我收到警告" List是原始类型。"如何使用泛型来正确满足此警告?我遇到了麻烦,因为我无法弄清楚如何定义" T"对于像我能够用于构造函数签名的全局变量。
public class MyClass{
private List input;
public <T extends Comparable<T>> MyClass(List<T> input){
this.input = input;
}
}
答案 0 :(得分:4)
您必须将您的类定义为参数化
public class MyClass<T extends Comparable<T>>{
private List<T> input;
public MyClass(List<T> input){
this.input = input;
}
}
答案 1 :(得分:0)
'原始类型'是指未具有特定通用参数类型的泛型类型。在这种情况下,这是因为您在input
声明中省略了泛型类型。将声明更改为:
private List<T> input;
应该解决错误。此外,构造函数声明不需要泛型参数,可以缩写为:
public MyClass(List<T> input){
this.input = input;
}
答案 2 :(得分:0)
您可能需要执行以下操作:
public class MyClass<T> {
private List<T> input;
}
答案 3 :(得分:0)
如您所见,问题是由您的成员变量input
使用List
而没有通用参数引起的。因此,该类型正在使用“原始”。要解决此问题,您有三种选择。你可以:
让您的全班通用
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。
答案 4 :(得分:0)
我相信你的问题就在于你所说的private List input;
,你没有为它正在寻找的通用类型游戏参数。您可以通过说private List<T> input;
答案 5 :(得分:0)
你可以使这个类变得通用。
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
来修改您的课程。通过允许Collection
的任何子类型的任何T
,我也使您的构造函数更灵活。