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