[英]Generics usage in the gemfire tutorial
在这个gemfire教程中
我无法解释此通用声明:
people = cache.<String, Profile>createRegionFactory(REPLICATE)
.addCacheListener(listener)
.create("people");
在此代码段中使用泛型的方式的意义何在?
cache.
后的<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)...
现在,将在SomeType<String, Profile>
而不是SomeType<Object, Object>
上调用addCacheListener(listener)
参考文献:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.