我有以下类层次结构:
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
”。我知道为什么,但我希望有一个属性很少的已知类型列表(属性不能被实例化,因为它是抽象类)。
我的问题是:我可以忽略该警告,还是应该更改我的代码(如何?)?
答案 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以了解有关此主题的更多信息。