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"。要解决此问题,您有三个选择。您可以:

  1. 使整个 class 通用

    public class MyClass<T extends Comparable<T>> {
    
        private List<T> input;
    
        public MyClass(List<T> input) {
            this.input = input;
        }
    
    }
    

  1. 使用通配符

    private List<? extends Comparable<T>> input;
    

  1. 重新考虑您的策略

     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 使您的构造函数更加灵活