我觉得我不是从正确的角度来看待这个问题,我只是没有考虑其他解决方案。
假设这个通用类;
public abstract class Port<T>
{
public delegate T PullDelegate();
private PullDelegate pull;
public Port(PullDelegate pull)
{
this.pull = pull;
}
public T Pull()
{
return pull();
}
}
它用于在图形节点编辑器中定义“端口”。端口可以将对象/值从一个节点传输到另一个节点,但它们也需要“类型安全”,这意味着我不能将任何端口插入另一个错误类型的端口(至少没有一些转换)。
节点“拥有”一个端口并为其一个方法赋予它一个委托,所以当另一个节点“拉”一个值时,该端口只是调用它并返回正确的值。
当我尝试从非泛型集合中调用Pull()
时,我的问题就开始了。显然,我可以创建一个非泛型的基本方法,但是然后Pull无法返回T
,它需要返回object
。
此外,每个节点都有其端口的集合访问器,因此其他项目可以获取它们。该收集必须是非泛型的,因为一个节点可以有许多类型的许多端口。
public abstract Port[] Inputs { get; }
public abstract Port[] Outputs { get; }
public abstract Port[] Entries { get; }
public abstract Port[] Exits { get; }
当非泛型类型发挥作用时,通用的一切都变得无法访问。如果只有Port<>[]
就是一件事。
我觉得我错过了什么......
答案 0 :(得分:1)
使用显式实现使<cfscript>
variables.File_Obj = createObject("java", "java.io.File");
variables.HTTP_Transport = createObject("java", "com.google.api.client.http.javanet.NetHttpTransport").init();
variables.JSON_Factory = createObject("java", "com.google.api.client.json.jackson2.JacksonFactory").init();
variables.HTTP_Request_Initializer = createObject("java", "com.google.api.client.http.HttpRequestInitializer");
variables.Offline_Credential_Builder = createObject("java", "com.google.api.ads.common.lib.auth.OfflineCredentials$Builder");
variables.API = createObject("java", "com.google.api.ads.common.lib.auth.OfflineCredentials$Api");
variables.adwordsService = createObject("java", "com.google.api.ads.adwords.axis.factory.AdWordsServices").init();
variables.Budget = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.Budget");
variables.BudgetBudgetDeliveryMethod = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.BudgetBudgetDeliveryMethod");
variables.BudgetBudgetPeriod = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.BudgetBudgetPeriod");
variables.BudgetServiceInterface = createObject("java", "com.google.api.ads.adwords.axis.v201509.cm.BudgetServiceInterface");
variables.Money = createObject("java", "com.google.api.ads.adwords.axis.v201506.cm.Money");
variables.adsession_builder = createObject("java", "com.google.api.ads.adwords.lib.client.AdWordsSession$Builder");
oAuth2Credential = Offline_Credential_Builder
.forApi(Api.ADWORDS)
.fromFile(variables.File_Obj.Init(expandPath('ads.properties')))
.build()
.generateCredential();
session = adsession_builder.fromFile(expandPath('ads.properties'))
.withOAuth2Credential(oAuth2Credential)
.build();
adwordsService.get(session, BudgetServiceInterface)
</cfscript>
实现非泛型接口Port<T>
。以这种方式,它隐藏在API中,但仍然允许您调用泛型类中的方法。
IPort