我刚刚发现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( ... )
语法?答案 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( ... )
语法?
当您需要显式提供类型参数时,您将使用前者。如果你没有,会推断出一种类型,但它可能不是你想要的。