7

我发现了一些通用代码,它让我对它的实际工作方式感到困惑。我不明白它从哪里获得用于 T 的泛型类型。这是一个过于简单的示例,但我仍然不明白这是如何有效的 Java 代码。

public static void main(String[] args) {
  System.out.print(get());
}

public static <T> T get()
{
  return (T) getObj();
}

public static Object getObj() 
{
  return Boolean.FALSE;
}
4

2 回答 2

4

类型推断基于调用点发生。

但是,如果将返回值分配给变量,则类型推断仅适用于返回类型。这是写在规范中

如果方法结果发生在将要进行赋值转换的上下文中,则 [...]

否则,任何未解析的类型参数总是变为Object.
在您的示例中,这将起作用,因为存在print(Object)过载。

另一方面,看看这段代码:

print(get());

public void print(Boolean x) { }

public <T> T get() {
    return (T) Boolean.FALSE;
}

get()这将产生编译错误,因为编译器Object在查看print().

于 2013-01-10T17:07:01.677 回答
2

在您编写的代码中, T不受任何约束。每当您调用该方法时,Java 都会为 T 分配一个类型get,它会查看您期望返回的类型……但这似乎只有在您明确声明您在等待哪种类型时才有效。看下面的例子:

public static void jump(String a) {
}

public static <T> T get() {
    return (T) null;
}

public static void main(String[] args) {
    //This works quite well, generic parameter T is inferred to be String
    String blah = get();
    jump(blah);
}

另一方面

public static void jump(String a) {
}

public static <T> T get() {
    return (T) null;
}

public static void main(String[] args) {
    //This doesn't work, Java does not bind T to anything hence Object is used... and no jump for object is found
    jump(get());
}

至少这是它在 Java 6 上的工作方式。

于 2013-01-10T16:58:26.327 回答