2014-09-27 73 views
-1

我有一個方法可以讓我的SDK的使用者將對象從內部存儲中取出。這些對象從一個通用類的基類繼承而來。物體的真實類型是確定性的,只有消費者才知道。該設置是這樣的:java中的通用返回類型返回對象

public class MyBaseClass<T> { 
    ... 
} 

public class TheBaseClassContainer { 
    private Map<String, MyBaseClass> container; 

    public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) { 
     return clazz.cast(this.container.get(id)); 
    } 
} 

的想法是,消費者可以簡單地指定他們希望後面的類,我們將處理其餘部分。不幸的是,當我這樣調用方法,以便:

TheBaseClassContainer container = ...; 
MyBaseClassSubclass subclass = container.getOne("myId", MyBaseClassSubclass.class); 

我得到一個編譯失敗說container.getOne正在返回類型MyBaseClass和分配期望類型MyBaseClassSubclass的對象。這是爲什麼發生?

+3

給出確切的錯誤消息。請注意'MyBaseClass'是通用的。你應該參數化它的使用。 – 2014-09-27 21:40:28

回答

0

對我的作品隊友:

class MyBaseClass<T> { 
} 

class B extends MyBaseClass<Integer>{} 

class TheBaseClassContainer { 
    private Map<String, MyBaseClass> container; 

    public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) { 
     return clazz.cast(this.container.get(id)); 
    } 
} 

用法:

TheBaseClassContainer theBaseClassContainer = new TheBaseClassContainer(); 
    B asd = theBaseClassContainer.getOne("asd", B.class); 

在編譯Java 7中