Java 解释泛型如何在此方法中工作

Java 解释泛型如何在此方法中工作,java,generics,Java,Generics,我一直在谷歌AdWords上工作,遇到了这段代码 adwords-api-6.4.0,com.google.api.adwords.lib.AdWordsUser 您能解释一下泛型是如何在getService方法中工作的吗?如何确定退货类型? 这种用法的目的是什么?它似乎没有提供类型安全性。 这个用法是否有一个特定的名称(这样我就可以找到关于它的更多信息并更改问题标题)?我对C的了解比Java多,但我想getService方法会使用AdWordsService类型的参数,并返回一个类型T,该类型

我一直在谷歌AdWords上工作,遇到了这段代码

adwords-api-6.4.0,com.google.api.adwords.lib.AdWordsUser

您能解释一下泛型是如何在getService方法中工作的吗?如何确定退货类型?
这种用法的目的是什么?它似乎没有提供类型安全性。
这个用法是否有一个特定的名称(这样我就可以找到关于它的更多信息并更改问题标题)?

我对C的了解比Java多,但我想
getService
方法会使用
AdWordsService
类型的参数,并返回一个类型
T
,该类型必须从
Java.rmi.Remote
派生

大概,
AdWordsServiceFactory.generateServicesTub
方法返回类型为
java.rmi.Remote
或类似类型,因此将其转换为
T
类型是合法的

在C#中,泛型以这种方式使用以避免转换,但转换仍在这里进行。我想使用这个特殊的方法,可以让你告诉泛型方法你想要的类型,从而使你不必强制转换到你想要的类型

我还可以想象,您需要在调用
getService
时指定
T
的类型。也许是这样

AdGroupServiceInterface adGroupService = user.getService<AdGroupServiceInterface>(AdWordsService.V200909.ADGROUP_SERVICE);
AdGroupServiceInterface adGroupService=user.getService(AdWordsService.V200909.ADGROUP\u服务);

编译器通常可以从调用上下文推断返回类型。在提供的示例中,编译器推断泛型类型为
AdGroupServiceInterface
,因为结果被分配给该类型。如果没有可从中推断返回类型的上下文,则必须显式指定它:

user.<AdGroupServiceInterface>getService(svc);
user.getService(svc);
但是,
getService
方法不是类型安全的。即使它包含一个cast,这也只能确保结果实现
java.rmi.Remote
接口。由于Java泛型中的类型擦除,确切的类型
T
未知,强制转换无法检查以确保结果是
AdGroupServiceInterface

这就是编译器将警告不安全强制转换的原因—当结果分配给
AdGroupServiceInterface
变量时,将引发
ClassCastException
,而不是在方法及其catch块内。

在java中,而不是user.getService(…)
AdGroupServiceInterface adGroupService = user.getService<AdGroupServiceInterface>(AdWordsService.V200909.ADGROUP_SERVICE);
user.<AdGroupServiceInterface>getService(svc);