2012-08-02 82 views
2

我有下面的类层次结构:集合抽象泛型类,原料类警告

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

要抑制警告:'@SuppressWarnings(“rawtypes”)' – 2012-08-02 13:07:56

回答

5

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

List<Property<?>> list; 
+0

'?'意味着同质,IMO,它不会在他的情况下工作。 – 2012-08-02 13:13:21

+0

'?'会使警告消失,当从列表中获取它们时,OP总是可以投射元素,因为类型以某种方式“知道”。 – dacwe 2012-08-02 13:21:25

1

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

1

由于这是一个警告,您可以随时选择忽略它;)。

该警告通知您,当您有List<Property>时,不知道Property类中的<T>是什么。如果你不确定,你可以使用List<Property<?>>来表明任何事情都会做。

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

+0

“?”表示未知但均匀。 – 2012-08-02 13:11:36

+0

根据[Oracle的泛型教程](http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html),被称为通配符的问号('?')表示未知类型。 – mthmulders 2012-08-02 13:14:55