gpt4 book ai didi

java - 为什么这种泛型的使用不会抛出运行时或编译时异常?

转载 作者:太空狗 更新时间:2023-10-29 22:45:13 25 4
gpt4 key购买 nike

我在一个类中有一个方法,该方法具有使用泛型指定的返回类型。

public class SomeMain {

public static void main(String[] args) {

Foo<Integer> foo = new Foo<Integer>();
System.out.println(foo.getFoo()); // Works, prints out "Foo"

}

public static class Foo<E> {
public E getFoo() {
return (E) "Foo";
}
}
}

对于通用返回类型,我假设上面示例中的返回值将计算为:

return (Integer) "Foo";  // Inconvertible types !!!

而是返回一个 String 并正确打印。

如果我将调用更改为:

String fooString = foo.getFoo(); // Compile error, incompatible types found
System.out.println(fooString);

我缺少什么来帮助我理解这里发生的事情以及为什么原始版本没有导致编译错误。

最佳答案

这是因为重载决议解决了你的 println调用 println(Object) , 因为没有 println(Integer) .

请记住,Java 的泛型会在运行时被删除。像 (E) "Foo" 这样的类型转换被移除,并被移动到调用站点。有时这不是必需的,因此只有在需要时才将内容转换为正确的类型。

换句话说,在 getFoo 内部没有进行任何转换。 .语言规范支持这一点:

Section 5.5.2 Checked Casts and Unchecked Casts

  • The cast is a completely unchecked cast.

    No run-time action is performed for such a cast.

删除后,getFoo返回 Object .然后传递给 println(Object) ,这非常好。

如果我调用此方法并传递 foo.getFoo ,我得到一个错误:

static void f(Integer i) {
System.out.println(i);
}
// ...
f(foo.getFoo()); // ClassCastException

因为这次需要被施放。

关于java - 为什么这种泛型的使用不会抛出运行时或编译时异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52458668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com