1

In this gemfire tutorial

I am not able to interpret this generic declaration:

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

What is the significance of the generics the way they have been used in this code snippet?

4

1 回答 1

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)将调用 onSomeType<String, Profile>而不是SomeType<Object, Object>


参考:

于 2013-10-18T19:09:36.977 回答