如何解决实例化泛型类的正确方法
通用性弱,请放轻松!
我有一些通过泛型结构如下的基类和派生类
public abstract class ProcessingNode<T extends APICommand> extends Node {
}
public class CustomerProcessingNode extends ProcessingNode<CHDAPICommand> {
}
public class MerchantProcessingNode extends ProcessingNode<MHDAPICommand> {
}
public class APICommand {
}
public class CHDAPICommand extends APICommand {
}
public class MHDAPICommand extends APICommand {
}
现在,在服务器启动期间,我想选择正确的 ProcessingNode
并将其缓存如下:
private void cacheProcessingNodeManager() throws ListenerException {
// throws Unexpected Bound error
ProcessingNode<T extends APICommand> processingNodeManager = null;
if (condition1 is true){
// throws "required ProcessingNode<T> but found CustomerProcessingNode"
processingNodeManager = new CustomerProcessingNode();
}
else if (condition2 is true){
// throws "required ProcessingNode<T> but found MerchantProcessingNode"
processingNodeManager = new MerchantProcessingNode();
} else {
// some exception
}
// cache processingNodeManager
}
创建 ProcessingNode
的特定对象的正确方法是什么?
解决方法
在方法 T
中,您无法决定 CHDAPICommand
必须是 MHDAPICommand
还是 cacheProcessingNodeManager()
。您只能在声明类和方法时决定 T
。
您可以通过两种方式创建 ProcessingNode
的特定对象。
- 使用通配符通用
public void cacheProcessingNodeManager() throws Exception {
ProcessingNode<? extends APICommand> processingNodeManager = null;
if (condition1 is true){
processingNodeManager = new CustomerProcessingNode();
} else if (condition2 is true){
processingNodeManager = new MerchantProcessingNode();
} else {
// some exception
}
}
- 使用方法声明泛型并使用向上转换
public <T extends APICommand>void cacheProcessingNodeManager() throws Exception {
ProcessingNode<T> processingNodeManager = null;
if (condition1 is true){
processingNodeManager = (ProcessingNode<T>) new CustomerProcessingNode();
} else if (condition2 is true) {
processingNodeManager = (ProcessingNode<T>) new MerchantProcessingNode();
} else {
// some exception
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。