2009-11-29 139 views
0

我想弄清楚如何使用Java的泛型來構造一個程序,並且想知道我是在做一些根本性的錯誤還是隻是在代碼中缺少一個簡單的錯誤。使用泛型的Java泛型參數本身?

說我有一個通用類:

public interface Handler<T>{ 
public void process(T t); 
} 

另一個通用類需要處理程序爲通用參數(僞碼):

public interface Processor<S extends Handler<T>>{ //<== Error: cannot find symbol 'T' 
public void addHandler(S u); 
public void process(T t); 
} 

摘要實施提供樣板實現

public abstract class ProcessorImpl<.....> implements Processor<.....>{ 
    ... 
} 

將處理器看作是分派處理數據請求的對象a給任意數量的處理程序。具體的實例可以工藝管線的變化,攔截過濾器,事件系統等

我希望能夠使用它像下面這樣:

Handler<String> myHandler1 = new HandlerImpl<String>(); 
Handler<String> myHandler2 = new HandlerImpl<String>(); 
Handler<Integer> myHandler3 = new HandlerImpl<Integer>(); 

Processor<Handler<String>> proc = ProcessorImpl<Handler<String>>(); 
proc.addHandler(myHandler1); 
proc.addhandler(myHandler2); 
proc.addhandler(myHandler3);//this should be an error! 

我不能讓它開始工作。在紙上,它看起來應該是微不足道的,有什麼想法?

感謝

+0

你說 '//錯誤!'。你的意思是你希望它是一個錯誤?或者編譯器發出一個你想避免的錯誤? – notnoop 2009-11-29 05:43:06

+0

對不起,我應該更清楚。錯誤!」預計在最後一行。我想要那個錯誤。 – Shahbaz 2009-11-29 06:29:38

+0

太好了。那麼我的回答實際上與這個問題有關! – notnoop 2009-11-29 07:12:29

回答

4

因此,每個類型參數僅在類中定義,因此T未在Processor類中定義或可用。

你可能想有Processor是:

public interface Processor<T>{ 
    public void addHandler(Handler<? super T> u); 
    public void process(T t); 
} 

這裏你聲明Processor只能處理事件/特定類型的輸入,例如StringInteger等,所以下面的語句將是有效的:

Processor<String> proc = ... 
proc.addHandler(new Handler<String>()); // valid 
proc.addHandler(new Handler<Object>()); // valid, as Strings are Objects too 
proc.addHandler(new Handler<Integer>()); // invalid, not a String handler 
proc.process("good");  // valid 
proc.process(1);   // invalid, not a String 

如果Processor旨在處理類型在運行時,並基於相應的運行時類型的動態分配,那麼你可以聲明proc(在最後一個例子)爲Processor<?>。那麼所有的陳述都是有效的。

+0

爲什麼不是 'public void addHandler(Handler u);' – 2009-11-29 05:53:22

+0

@Harold,它也可以工作,但它有點限制。 'addHandler'接受'Handler '可以防止'Processor '接受'Handler ',這應該是有效的。想象一下僅僅打印參數的'LoggerHandler '。你應該能夠將它傳遞給我認爲的任何處理器。 – notnoop 2009-11-29 05:56:27

0

它不應該工作,爲您的T =字符串和整數的處理程序是不允許的。 在編譯時,你的類將有方法進程(String t)而不是進程(Integer t)。

1

這些變化應該工作:

public interface Processor<T, S extends Handler<T>> 

class ProcessorImpl<T, S extends Handler<T>> 
    implements Processor<T, S> 

Processor<String, Handler<String>> proc = new ProcessorImpl<String, Handler<String>>();