2009-11-29 138 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>>();