Java 用于分配全局变量的泛型
Java generics to assign global variables
在此示例中,我收到警告 "List is a raw type." 如何使用泛型来正确满足此警告?我遇到了麻烦,因为我无法弄清楚如何为全局变量定义 "T",就像我能够为构造函数签名那样。
public class MyClass{
private List input;
public <T extends Comparable<T>> MyClass(List<T> input){
this.input = input;
}
}
'Raw Types' 指的是尚未指定泛型参数类型的泛型类型。在本例中,这是因为您在 input
的声明中省略了泛型类型。将声明更改为:
private List<T> input;
应该可以解决错误。此外,您的构造函数声明不需要泛型参数,可以缩短为:
public MyClass(List<T> input){
this.input = input;
}
您可能需要执行以下操作:
public class MyClass<T> {
private List<T> input;
}
您必须将 class 定义为参数化
public class MyClass<T extends Comparable<T>>{
private List<T> input;
public MyClass(List<T> input){
this.input = input;
}
}
如您所见,问题是由您的成员变量 input
使用 List
而没有泛型参数引起的。因此,正在使用该类型 "raw"。要解决此问题,您有三个选择。您可以:
使整个 class 通用
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;
来修复它
您可以使 class 通用。
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
来修改您的 class。我还通过允许 T
.
的任何子类型的任何 Collection
使您的构造函数更加灵活
在此示例中,我收到警告 "List is a raw type." 如何使用泛型来正确满足此警告?我遇到了麻烦,因为我无法弄清楚如何为全局变量定义 "T",就像我能够为构造函数签名那样。
public class MyClass{
private List input;
public <T extends Comparable<T>> MyClass(List<T> input){
this.input = input;
}
}
'Raw Types' 指的是尚未指定泛型参数类型的泛型类型。在本例中,这是因为您在 input
的声明中省略了泛型类型。将声明更改为:
private List<T> input;
应该可以解决错误。此外,您的构造函数声明不需要泛型参数,可以缩短为:
public MyClass(List<T> input){
this.input = input;
}
您可能需要执行以下操作:
public class MyClass<T> {
private List<T> input;
}
您必须将 class 定义为参数化
public class MyClass<T extends Comparable<T>>{
private List<T> input;
public MyClass(List<T> input){
this.input = input;
}
}
如您所见,问题是由您的成员变量 input
使用 List
而没有泛型参数引起的。因此,正在使用该类型 "raw"。要解决此问题,您有三个选择。您可以:
使整个 class 通用
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;
您可以使 class 通用。
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
来修改您的 class。我还通过允许 T
.
Collection
使您的构造函数更加灵活