簡體   English   中英

實例化通用 class 的正確方法

[英]Correct way to instantiate a generic class

弱通用,請 go 容易!
我有一些通過 generics 結構如下的基類和派生類

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 個錯誤。

創建ProcessingNode特定對象的正確方法是什么?

您不能決定T必須是方法cacheProcessingNodeManager()中的CHDAPICommandMHDAPICommand 您只能在聲明 class 和方法時決定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
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM