繁体   English   中英

通用方法语法 <Type> 方法()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM