gpt4 book ai didi

java - 为什么从无界通配符 不会生成未经检查的转换警告?

转载 作者:行者123 更新时间:2023-12-04 06:15:00 25 4
gpt4 key购买 nike

想我之前问过这个问题,但仍然在一定程度上不明白。

  • 从原始到 - 没有未经检查的转换警告。理解,因为两者都是可具体化的类型。
  • 从原始到 - 未经检查的转换警告。从 是一个不可具体化的类型。
  • - 没有未经检查的转换警告。为什么?因为前者是可具体化的类型,而后者不是。我认为这类似于第 2 条。
  • 最佳答案

    <?><? extends Object>实际上是同一个东西,应该可以互换。

    实际上,由于 List<? extends Object>List<?>的超型(反之亦然),如果可以安全地转换 ListList<?> ,转换 List 也应该是安全的至 List<? extends Object> .

    规范要求无界通配符 <?>在某些地方,虽然是孪生兄弟<? extends Object>未提及(因此被禁止)。没有任何理论上的理由。语言设计者可能认为 <?>对于实际用例来说已经足够了。

    例如,在 5.1.9 Unchecked Conversion 中,转换 raw GG<T1..Tn>除非所有 Ti=?,否则生成强制编译时警告.这有点太苛刻了;反例:

    class G<N extends Number>{}

    G x = ...;
    G<? extends Number> y = x; //warning, tho absolutely safe

    从 x 到 y 的转换是安全的,警告真的没有必要。

    可以放宽规则以免除所有安全转换。
    我们知道转换原始数据是安全的 GG<?..?> ;此外,如果 G<T1..Tn>G<?..?>的超型, 转换 GG<T1..Tn>也是安全的,应该在没有警告的情况下允许。这当然是有道理的。

    但是,检查 G<?..?>G<T1..Tn> 的子类型不是一项微不足道的任务;语言设计者可能会说,见鬼去吧,为了未经检查的转换而这样做是不值得的,无论如何,这不是类型系统的重要组成部分。

    关于java - 为什么从无界通配符 <?> 到 <? extends Object> 不会生成未经检查的转换警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367682/

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