[英]Generic method syntax <Type>method()
我刚刚发现在Java中可以实现以下功能:
我们有一个方法:
public <T> void doSomething( T value );
我们可以这样称呼它:
this.doSomething( "Hello World" );
或者我们可以用我刚刚发现的方式来称呼它:
// Restricts the argument type to String
this.<String>doSomething( "Hello World" );
起初,我认为如果必须进行类比较,这会非常方便,因为我们在编译时就知道T
的类型,但是泛型不是运行时功能,因此无法使用:
public <T> void doSomething( T value ) {
if ( field instanceof T ) ... // Not working
}
问题:
this.method( ... )
语法上使用this.<Type>method( ... )
this.method( ... )
语法? 当由于某种原因无法自动推断类型时,该语法非常方便。 有很多类似的情况。 例如,如果返回值是从泛型类型派生的,并且它是更复杂的表达式的一部分,则该类型不明显。
例:
<T> T someMethod(T o) {
return o;
}
Number res = (num == null) ? this.<Number>someMethod(null) : null;
如果没有特殊语法(无法编译),此示例将无法工作,因为无法在此表达式中推断类型。
还要注意,可以使用类似的语法来调用静态方法。 例如,以下代码片段导致编译错误:
Collection<Integer> getCollection() {
return someCondition ? Collections.emptyList() : Collections.singletonList(Integer.valueOf(42));
}
因此,我们必须改为指定类型:
Collection<Integer> getCollection() {
return someCondition ? Collections.<Integer>emptyList() : Collections.singletonList(Integer.valueOf(42));
}
关于您的第二个问题:除了明确给出的泛型类型之外,没有其他区别。
为什么和在通常的
this.method( ... )
语法上使用this.<Type>method( ... )
this.method( ... )
语法?
当您需要显式提供类型参数时,可以使用前者。 如果您不这样做,则会为您推断类型,但这可能不是您想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.