gpt4 book ai didi

Java泛型参数本身使用泛型?

转载 作者:行者123 更新时间:2023-12-01 17:40:11 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何使用 Java 的泛型构建程序,并想知道我是否做了一些根本性错误的事情,或者只是在代码中遗漏了一个简单的错误。

假设我有一个通用类:

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

另一个泛型类将Handler作为泛型参数(伪代码):

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<.....>{
...
}

将处理器视为一个对象,它将处理数据的请求分派(dispatch)给任意数量的处理程序。具体实例可以是流程管道、拦截过滤器、事件系统等的变体。

我希望能够像下面这样使用它:

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!

我无法让它工作。从纸面上看,这应该是微不足道的,有什么想法吗?

谢谢

最佳答案

因此每个类型参数仅在类中定义,因此 T未在 Processor 中定义或可用类。

您可能想要 Processor是:

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

在这里您声明了 Processor只能处理特定类型的事件/输入,例如String , Integer等等。所以下面的语句将是有效的:

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<?> 。那么所有的陈述都是有效的。

关于Java泛型参数本身使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1814745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com