用于分配全局变量的Java泛型

时间:2015-03-12 18:31:38

标签: java generics global-variables comparable

在此示例中,我收到警告" List是原始类型。"如何使用泛型来正确满足此警告?我遇到了麻烦,因为我无法弄清楚如何定义" T"对于像我能够用于构造函数签名的全局变量。

public class MyClass{

    private List input;

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

}

6 个答案:

答案 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而没有通用参数引起的。因此,该类型正在使用“原始”。要解决此问题,您有三种选择。你可以:

  1. 让您的全班通用

    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);
                 }
             }
        
        }
        
      2. 我会建议选项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,我也使您的构造函数更灵活。