【问题标题】:Correct way to instantiate a generic class实例化泛型类的正确方法
【发布时间】:2021-07-09 05:19:00
【问题描述】:

通用性较弱,请放轻松!
我有一些通过泛型构造如下的基类和派生类

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
}       

但我得到了 2 个错误,如上面 cmets 中突出显示的那样。

创建ProcessingNode 的特定对象的正确方法是什么?

【问题讨论】:

  • 在您的方法cacheProcessingNodeManager 的上下文中,T 是什么?您不能在方法内部动态决定T 必须是CHDAPICommandMHDAPICommand;它必须在编译时知道。
  • 声明 ProcessingNode&lt;T extends APICommand&gt; processingNodeManager = null; 不正确。你的意思是ProcessingNode&lt;? extends APICommand&gt; processingNodeManager = null;
  • @ernest_k yup...这就解决了!!
  • @Jesper aahhh....超级愚蠢的菜鸟,&lt;?&gt; 是我应该做的,而不是&lt;T&gt;

标签: java generics inheritance instantiation


【解决方案1】:

您无法在方法 cacheProcessingNodeManager() 中决定 T 必须是 CHDAPICommandMHDAPICommand。只能在声明类和方法时决定T

您可以通过两种方式创建ProcessingNode 的特定对象。

  1. 使用通配符通用
    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
        }
    }
  1. 使用方法声明泛型并使用向上转换
    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
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多