当我有一个Java通用函数时,例如:
<T> T choose(T a, T b) { }
我从某个地方调用它,如何找出T的推断类型?
编辑:类型推断发生在编译时.所以我要问的是,如何让编译器告诉我它在编译过程中所拥有的某些信息(推断的类型),但这不使它进入.class文件?
我可以做的一件事是尝试将结果分配给各种类型的变量,例如:
// Compiles, so inferred type is at least Throwable.
Throwable foo = choose(new EOFException(), new FileNotFoundException());
// If this compiles, T must be Map or something that implements Map.
Map foo = choose(new HashMap(), new TreeMap());
但这是间接的.我想让编译器告诉我它为T推断什么类型,而不是我不得不打20个问题.
最佳答案
在eclipse中,将鼠标悬停在方法调用表达式上. Eclipse将使用推断的类型显示签名.
编辑:看来这确实并不总是正确的.对于以下声明
interface I {void foo();}
class C {}
class D extends C implements I { public void foo() {}}
class E extends C implements I { public void foo() {}}
和表达,
java.util.Arrays.asList(new D(), new E()).get(0).foo();
显示的推断类型是?扩展C,但实际推断的类型是?扩展C&我(从对foo的允许访问中可以看出).我不知道为什么eclipse显示的类型与其内置编译器推断的类型不同…