2012-11-05 77 views
0

這裏的情況是:如何將類型傳遞到FUNC

interface A{}//interface for entities 
class B implements A{}//entity B 
class C implements A{}//entity C 

abstract class AR<E extends A>{}//generate list of E via a file,this will be done after the construct func. 
class BR extends AR<B>{} 
class CR extends AR<C>{} 

現在我想保持: Map<String,List<A>> data;//<filepath+filename, list of entities in file>

的FUNC。打擊將返回基於fileAddr名單:

<E extends A,R extends AR<E>> List<A> getList(String fileAddr) 
{ 
if(data.containsKey(fileAddr)) 
    return data.get(fileAddr); 
else 
{ 
    AR<E> reader=new R(fileAddr);//generate a list of E via this file 
    List<E> values=reader.getValues(); 
    data.put(fileAddr,values); 
    return values; 
} 
} 

但是,這並不工作,並且不支持new R(fileAddr)

那麼如何實現getList()函數。基於規格。以上。

+0

是「E」被傳遞到這個類通過類的聲明? – HericDenis

+2

你不能使用'new'關鍵字來創建一個泛型類型:new R(...)在你的情況下,在Java中是非法的。 – breezee

+0

getList是一個泛型方法,E作爲getList的泛型類型傳遞。 – jchzhu

回答

0

不能使用new以產生類型參數的一個實例。技術上的原因是在執行getList之前,類型信息已被擦除。無論如何,Java語言不允許它。

解決此問題的方法之一是傳入可創建所需實例的工廠對象。

另一種解決方法是將參數類型的Class對象作爲參數傳遞,然後反射性地創建實例;例如是這樣的:

<E extends A,R extends AR<E>> List<A> getList(String fileAddr, Class<R> rClass) 
{ 
if(data.containsKey(fileAddr)) 
    return data.get(fileAddr); 
else 
{ 
    Constructor<R> ctor = rClass.getConstructor(String.class); 
    R reader=ctor.newInstance(fileAddr); 
    List<E> values=reader.getValues(); 
    data.put(fileAddr,values); 
    return values; 
} 
} 

(會有一堆的例外處理...)

0

即線應該與實際的類來替代,例如:

AR<E> reader=new BR(fileAddr); //or AR<B> 

或:

AR<E> reader=new CR(fileAddr); //or AR<C> 
相關問題