Java 实例化泛型类的正确方法
通用性弱,请放轻松Java 实例化泛型类的正确方法,java,generics,inheritance,instantiation,Java,Generics,Inheritance,Instantiation,通用性弱,请放轻松 我有一些基类和派生类,通过泛型结构如下 public abstract class ProcessingNode<T extends APICommand> extends Node { } public class CustomerProcessingNode extends ProcessingNode<CHDAPICommand> { } public class MerchantProcessingNode extends Processi
我有一些基类和派生类,通过泛型结构如下
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 {
}
但我得到了上面评论中强调的2个错误
创建
ProcessingNode
的特定对象的正确方法是什么?您不能决定t
必须是CHDAPICommand
或MHDAPICommand
在方法cacheProcessingNodeManager()中。您只能在声明类和方法时决定T
您可以通过两种方式创建ProcessingNode
的特定对象
使用通配符
public void cacheProcessingNodeManager()引发异常{
ProcessingNode在方法缓存处理NodeManager
的上下文中,什么是T
?您不能在方法内部动态地决定T
必须是CHDAPICOMAND
或MHDAPICOMAND
;它必须在编译时已知。声明ProcessingNode ProcessingNode processingNodeManager=null;
不正确。您的意思是ProcessingNode@ernest_k是的…这就解决了!!@Jesper aahh…超级愚蠢的noob,
是我应该做的绑定,而不是
。
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
}
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
}
}