我是java中的泛型新手。我在下面看到了方法声明。有人可以用外行来解释吗?
public interface SomeService{
<A, C> C submit(ServiceEnum service, A request, Class<C> responseType);
}
提前谢谢你。
答案 0 :(得分:4)
接口声明了一个包含两个类型变量的泛型方法:A
和C
。 request
的类型为A
(可以是任何对象类型),Class
参数responseType
的类型变量为C
。它返回C
类型的变量。因此,如果将Class<Integer>
作为responseType
传递,则会返回Integer
。
答案 1 :(得分:3)
此声明首先定义了两种通用类型A
和C
。然后,它要求第二个参数的类型为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);
}
现在假设您有Rectangle
,Circle
等类
所以如果你给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);
根据您作为request
和responseType
传递的参数,您的A
和C
类型变量将自动分配给实际参数的类类型。< / p>
在这种情况下,返回类型为C
(取决于您实际传递的内容为responseType
)。