繁体   English   中英

Java泛型分配全局变量

[英]Java generics to assign global variables

在此示例中,我得到警告“列表是原始类型”。 如何使用泛型正确满足此警告? 我遇到了麻烦,因为我不知道如何像为构造函数签名那样为全局变量定义“ T”。

public class MyClass{

    private List input;

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

}

您必须将类定义为参数化

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

    private List<T> input;

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

}

“原始类型”是指没有特定泛型参数类型的泛型类型。 在这种情况下,这是因为您在input的声明中省略了泛型类型。 将声明更改为:

private List<T> input;

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

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

您可能需要执行以下操作:

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

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

  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); } } } 

我建议选择1或3。

我相信您的问题是您说private List input; ,则无需为要查找的通用类型设置任何参数。 您可以通过说private List<T> input;来解决它private List<T> input;

您可以使该类通用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM