Java泛型用于赋值全局变量

3
在这个例子中,我收到了“List是原始类型”的警告。我该如何使用泛型来正确解决这个警告呢?我很困惑,因为我无法弄清楚如何像构造函数签名那样为全局变量定义“T”。
public class MyClass{

    private List input;

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

}

你可能应该将整个类泛型化。 - SLaks
6个回答

4

您必须将您的类定义为参数化

public class MyClass<T extends Comparable<T>>{

    private List<T> input;

    public MyClass(List<T> input){
        this.input = input;
    }

}

0
“Raw Types” 指的是未指定其泛型参数类型的泛型类型。在这种情况下,这是因为您在声明 input 时省略了泛型类型。将声明更改为:
private List<T> input;

应该解决了错误。此外,您的构造函数声明不需要泛型参数,可以缩短为:

public MyClass(List<T> input){
    this.input = input;
}

0

你可能需要做类似这样的事情:

public class MyClass<T> {
    private List<T> input;
}

0

正如您所见,问题是由于您的成员变量input使用没有泛型参数的List引起的。因此,该类型被使用为“原始类型”。要解决此问题,您有三个选项。您可以:

  1. 将整个类泛型化

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

或者

使用通配符 私有列表>输入;

或者

  • 重新思考你的策略

     public class MyClass {
    
         private List<Comparable<T>> input;
    
         public <T extends Comparable<T>> MyClass(List<T> input) {
             this.input = new LinkedList<>();
             // 显然,有更好的方法来复制一个列表...
             for (Comparable<T> obj : input) {
                 this.input.add(obj);
             }
         }
    
    }
    
  • 我建议选择1或3。

    选项3无法工作,我在类变量List<Comparable<T>> input上得到“无法解析符号'T'”。 - Spik330

    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 来修改您的类。我还通过允许任何 T 子类型的 Collection 使您的构造函数更加灵活。

    0

    我认为你的问题在于你写了 private List input;,它没有指定泛型类型所需要的参数。你可以通过这样写来解决问题:private List<T> input;


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接