通用方法语法<type> method()</type>

时间:2014-07-01 22:01:36

标签: java generics

我刚刚发现Java中可以使用以下内容:

我们有一个方法:

public <T> void doSomething( T value );

我们可以这样称呼它:

this.doSomething( "Hello World" );

或者我们可以按照我刚刚发现的方式来调用它:

// Restricts the argument type to String
this.<String>doSomething( "Hello World" ); 

起初我认为如果我们必须进行类比较,这可能会非常方便,因为我们在编译时知道T的类型,但是泛型不是运行时功能所以这会赢得&#39工作:

public <T> void doSomething( T value ) {
    if ( field instanceof T ) ...  // Not working
}

问题:

  • 为什么以及在哪里应该使用this.<Type>method( ... )语法而不是通常的this.method( ... )语法?
  • 是否存在差异(参数的编译时类型限制除外)?

2 个答案:

答案 0 :(得分:4)

当由于某种原因无法自动推断类型时,语法很方便。 有很多这样的情况。例如,如果返回值是从泛型类型派生的,并且它是更复杂表达式的一部分,那么类型不明显。

示例:

<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));
}

关于你的第二个问题:除了明确给出的泛型类型之外没有其他区别。

答案 1 :(得分:1)

  

为什么以及在哪里使用this.<Type>method( ... )语法   通常的this.method( ... )语法?

当您需要显式提供类型参数时,您将使用前者。如果你没有,会推断出一种类型,但它可能不是你想要的。