2015-04-02 68 views
0

可能,我會問的是一個可怕的問題,因爲JAVA是強類型的語言,但我會問,確定。通用和動態關聯的類型

我想實現一些傑克遜將要映射到的模型。 假設我們有: 有一個屬性值的SomeObject。 SomeObject是一個接口:

interface SomeObject <T> { 
    T getValue(); 
} 

值可以是布爾值,可以是List,也可以是簡單的字符串。 ObjectOne和ObjectTwo實現SomeObject 我想知道,如果我們將有這樣的對象:

List<SomeObject> someObject = new ArrayList<>(); 

,我們將不得不在該列表:ObjectOne,ObjectTwo如果有可能調用的getValue每個那些對象,並沒有將它投射到給定的課堂上,獲得適當的價值? 我知道我可以做這樣的事情:

(String) list.get(0).getValue(); 

但有一種方式來獲得這樣的結果:

String firstItemIsAString = list.get(0).getValue(); 
ArrayList secondItemIsAnArrayList = list.get(1).getValue(); 

我知道這是不是一個javascript,但可能與仿製藥的一些幫助這可能是不可思議的? 我會在SomeObjects的列表中添加該項目將以這樣的方式添加:

List<SomeObject> list = new ArrayList<>(); 
list.add(new ObjectOne<String>()); 
list.add(new ObjectTwo<ArrayList>()); 
+1

不,泛型是編譯時構造。編譯時必須知道類型。 – 2015-04-02 22:21:27

+0

所以就像我想的那樣。謝謝@SotiriosDelimanolis – 2015-04-02 22:23:47

+1

也許如果我們知道你爲什麼想這樣做,我們可以建議一個可行的選擇。 – Radiodef 2015-04-02 22:30:02

回答

2

你將一個布爾值和一個ArrayList一起放入某個集合中,該集合的泛型類型必須是兩種常見的類型,它們只是留下了Object - 因此根本沒有關於集合中類型的信息。

要直接回答您的問題:不,沒有辦法保存泛型中的某些內容,因爲它們在運行時不見了。

-1

也許一個輔助方法會幫助你假裝的Java較少類型安全:一旦

public interface SomeObject <T> { 
    T getValue(); 
} 
public static void main(String...args){ 
    List<SomeObject<?>> objectList=new ArrayList<SomeObject<?>>(); 
    String firstItemIsAString = converter(objectList.get(0).getValue()); 
} 
public static <t> t converter(Object input){ 
    return (t) input; 
} 
+0

也許你應該解釋一下這個實際做了什麼,它的侷限性以及它爲什麼可能有用或沒用。 – Radiodef 2015-04-02 23:55:24