抽象普通类的集合,未加工的类型警告

时间:2012-08-02 13:04:58

标签: java generics abstract raw-types

我有以下类层次结构:

public abstract class Property<T>
{
    private long id;
    private String name;
    private T value;

    /*setters and getters*/
}

public class NumberProperty extends Property<Integer>

public class TextProperty extends Property<String>

...以及包含List<Property> properties的类。我得到“Property is raw type. References to generic type Property<T> should be parametrized”。我知道为什么,但我希望有一个属性很少的已知类型列表(属性不能被实例化,因为它是抽象类)。

我的问题是:我可以忽略该警告,还是应该更改我的代码(如何?)?

3 个答案:

答案 0 :(得分:5)

如果您不关心它是哪种类型的对象,请使用Property<?>这将指示编译器您知道自己在做什么。

List<Property<?>> list;

答案 1 :(得分:1)

Java中的集合是同构的,因此将不同类型的值放入其中是错误的。请注意Property<Integer>Property<String>没有层次关系 - 这些是两种不同的类型,Java类型系统将无法表示您的列表,其中某些属性是字符串和一些整数。您唯一的选择是失去类型安全。

答案 2 :(得分:1)

因为它是一个警告,你总是可以选择忽略它;)。

警告会通知您,当您拥有List<Property>时,您不知道<T>课程中Property的内容。如果您不确定,可以使用List<Property<?>>表示可以执行任何操作。

请参阅Oracles generics tutorial以了解有关此主题的更多信息。