2012-08-02 84 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