[英]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()
中的CHDAPICommand
或MHDAPICommand
。 您只能在聲明 class 和方法時決定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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.