gemfire教程中的泛型用法

时间:2013-10-18 18:56:22

标签: java generics gemfire

在此gemfire tutorial

我无法解释这个通用声明:

people = cache.<String, Profile>createRegionFactory(REPLICATE)
      .addCacheListener(listener)
      .create("people");

泛型在此代码段中的使用方式有何意义?

1 个答案:

答案 0 :(得分:1)

<String, Profile>之后的cache.是显式类型参数。当编译器无法正确推断类型参数时,通常会使用显式类型参数,在这种情况下,您明确告诉它将类型参数推断为您在方法名称前面的尖括号中传递的参数。

例如,假设您有一个方法:

public <T> void someMethod(T param1, T param2) {
    // body
}

现在,如果您将此方法调用为:

obj.someMethod(12, "abc");

然后你会期望调用应该给你一个编译器错误,因为你将不同的类型传递给相同的类型参数。但事实并非如此。实际上,类型T被推断为:

T: Object & Serializable & Comparable<? extends Object&Serializable&Comparable<?>>

但是,您可能希望编译器将类型参数推断为Object。那么,你会怎么做?你需要一个显式的类型参数:

obj.<Object>someMethod(12, "abc");

..现在类型T将被推断为Object


所以,在你的情况下,我猜测createRegionFactory(REPLICATE)方法会返回一个带有意外类型参数的参数化类型,比如说 - SomeType<Object, Object>,因为编译器无法推断出类型参数,可能是因为没有足够的背景。但是您希望在参数化类型上使用类型参数addCacheListener(listener)调用另一个方法链 - <String, Profile>

因此,为了明确告诉编译器返回带有某个类型参数的参数化类型,可以使用方法调用显式地给它们:

cache.<String, Profile>createRegionFactory(REPLICATE)
     .addCacheListener(listener)...

现在,addCacheListener(listener)将在SomeType<String, Profile>而不是SomeType<Object, Object>上调用


<强>参考文献: