需要帮助理解java中的复杂泛型声明

时间:2013-11-19 19:06:23

标签: java generics

我是java中的泛型新手。我在下面看到了方法声明。有人可以用外行来解释吗?

public interface SomeService{
   <A, C> C submit(ServiceEnum service, A request, Class<C> responseType);
}

提前谢谢你。

3 个答案:

答案 0 :(得分:4)

接口声明了一个包含两个类型变量的泛型方法:ACrequest的类型为A(可以是任何对象类型),Class参数responseType的类型变量为C。它返回C类型的变量。因此,如果将Class<Integer>作为responseType传递,则会返回Integer

答案 1 :(得分:3)

此声明首先定义了两种通用类型AC。然后,它要求第二个参数的类型为A,第三个参数的类型为Class<C>。此方法的返回类型将为C类型,该类型将与最后一个参数的类匹配。

调用此方法的一个示例是:

OrderRequest request = new OrderRequest(...)
Class<OrderConfirmation> responseType = OrderConfirmation.class
OrderConfirmation confirmation = someService.submit(service, request, responseType);

答案 2 :(得分:0)

通俗地说,处理泛型可以用这种方式解释:

在通常的Java编程中(没有泛型)

您可以指定变量。 int a = 10;

您可以指定对象。 SomeClass objOfSomeClass = new SomeClass();

但是当你来到Generics时,指定对象类型(实际的类名) 与List<String>一样,您可以将String替换为某个变量吗?

变量不应接受通常的对象和变量,JUST classnames

类似List<T>T = String之类的内容。 请注意,在这种情况下,我们将T称为类型变量。 (因为它包含类类型而不是对象本身)。 Java编译器允许这样的类名/类型分配

所以这就是你做的。

您以<>格式指定类型变量。

interface GeometricShape<T> {
    void drawShape();
    T addShape(T anotherShape);
}

现在假设您有RectangleCircle等类

所以如果你给GeometricShape<Circle>

然后T addShape(T anotherShape);变为Circle addShape(Circle anotherShape);

在这种情况下,您在界面中指定了类型变量T,并且此T在界面内的所有方法都可用到所有方法。

假设我不想在完整界面中使用它,只需要一两种方法。 因此,您也可以只在一个方法中指定类型变量 - 在方法的返回类型之前附加<A, C>(此处为两个类型变量)

就像你问过的那样。

<A, C> C submit(ServiceEnum service, A request, Class<C> responseType);

根据您作为requestresponseType传递的参数,您的AC类型变量将自动分配给实际参数的类类型。< / p>

在这种情况下,返回类型为C(取决于您实际传递的内容为responseType)。