gpt4 book ai didi

java - 添加通用参数时未经检查的强制转换警告

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:03 24 4
gpt4 key购买 nike

以下 Java 代码不会生成未经检查的转换警告(使用 Java 8 的 Eclipse 编译器进行测试):

class Parent<T> {}

class Child<T> extends Parent<T> {}

class Test {
<T> void test() {
Parent<T> p = new Child<T>();
// cast accepted by compiler:
Child<T> cast = (Child<T>)p;
}
}

所以我理解编译器一定已经以某种方式拾取了如果 p既是 Parent<T> (按编译时类型)和 Child (通过运行时转换),那么可以安全地假设它是一个 Child<T>作为Child在其 extends 中传递其类型参数条款。

但是,以下类似代码确实会生成未经检查的强制转换警告:

class Parent<T> {}

class Child<T, U> extends Parent<T> {}

class Test {
<T, U> void test() {
Parent<T> p = new Child<T, U>();
// cast considered unsafe by compiler:
Child<T, ?> cast = (Child<T, ?>)p;
}
}

然而,考虑第一个示例安全的推理也应该适用于此!如果pParent<T>和一个 Child那么它应该是 Child<T, ?> , 给出 Childextends条款!

(请注意,我没有在转换中包含 U,因为它确实无法检查,无论是在编译时还是运行时。)

有没有办法在没有警告的情况下转换为具有附加参数的子类型?

最佳答案

正如我在评论中所说,这两个转换在 Oracle 的 Java 1.8.0_112 编译器中工作,因此如果您愿意,可能是编译器错误或限制。

我猜这两种转换都不应该是不安全的,遵循假设子类是正确的原则(即实例确实是 Child )它必须与 Child<T, ?> 兼容。如果它是 Parent<T> .相反,如果您尝试将其转换为类似 Child<U, V> 的内容,它将不起作用(即产生警告)。其中 U不保证是 TV不是? ,因为有 Child 的是 Parent<T>不一定是Child<U, V> .

关于java - 添加通用参数时未经检查的强制转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54179965/

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