【问题标题】:The limitation of Arrays.asList() is not true in Thinking in Java 4th Edition [closed]Arrays.asList() 的限制在 Thinking in Java 4th Edition 中不正确 [关闭]
【发布时间】:2023-03-10 11:01:01
【问题描述】:

在这本书中,它说:

Arrays.asList() 的一个限制是它需要对 List 的结果类型,并不关注你的 正在分配给它。

这本书是Thinking in Java By Bruce Eckel

但是,以下代码工作正常,与本书第 280 页中显示的代码相反

public class Main{

    public static void main(String[] args) {
        List<Snow> snow = Arrays.asList(new Light(), new Heavy());
    }
}
class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}

Java 1.8、IntelliJ、Windows 7

感谢任何想法。

【问题讨论】:

  • Powder、Light、Heavy 类获取 Snow 类的属性然后显然可以正常工作
  • 两件事:第一,你得到的东西至少符合List 接口,所以那里没有问题,第二,你认为问题是什么?这里没有什么可以立即跳出来,这显然是大错特错......
  • @Makoto 抱歉,我更新了问题。
  • @KevinEsche 抱歉,我更新了问题。
  • @Ajinkya 抱歉,我更新了问题。

标签: java inheritance type-inference


【解决方案1】:

此代码在 Java-7 中失败,但在 Java-8 中编译。使用 javac 7u80 我看到了:

Main.java:7: error: incompatible types
                List<Snow> snow = Arrays.asList(new Light(), new Heavy());
                                               ^
  required: List<Snow>
  found:    List<Powder>
1 error

Java-8 中的类型推断得到显着改进。在此之前,仅根据对该子表达式的分析为每个子表达式推断类型,因此无论周围的上下文如何,都需要知道 Arrays.asList(new Light(), new Heavy()) 的类型。在 Java-8 中,周围的上下文可能与表达式类型有关。

在 Java 语言规范版本 8 中有一个 whole new chapter 专用于类型推断。这不是很容易阅读,但据我所知,现在不是为每个子表达式分配具体类型,而是分配了一组constraints。在我们的例子中,约束是Light &lt;: T &amp;&amp; Heavy &lt;: T(这里没有推断出确切的类型)。接下来执行缩减过程,将约束集缩减为边界集,同时考虑expression compatibility constraints

【讨论】:

  • appriciate 但请您更深入地解释一下周围的上下文和表达式类型。??
  • @VikrantKashyap 我添加了一些解释,但要全面了解这一点,您必须阅读规范。
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多