Java编程思想学习笔记(一)

本文探讨了Java SE5/6版本中Arrays.asList()方法的类型推断问题,当尝试创建特定类型的List时,该方法可能不会如预期那样工作。文章通过具体示例解释了这一现象,并指出此问题在Java 8及以上版本中已得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java编程思想中文版第四版,第221页持有对象章节有几段话,让我一直懵逼,现在解决了,所以记录一下

//: holding/AsListInference.java
// Arrays.asList() makes its best guess about type.
import java.util.*;

class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
class Crusty extends Snow {}
class Slush extends Snow {}

public class AsListInference {
  public static void main(String[] args) {
    List<Snow> snow1 = Arrays.asList(
      new Crusty(), new Slush(), new Powder());

    // Won't compile:
    // List<Snow> snow2 = Arrays.asList(
    //   new Light(), new Heavy());
    // Compiler says:
    // found   : java.util.List<Powder>
    // required: java.util.List<Snow>
} ///:~

当试图创建snow2时,Arrays.asList中只有Powder类型,因此它会创建List< Powder >而不是List < Snow >。
这句话一直让我搞不懂,因为我这段代码编译和执行时完全正常的,如下:
在这里插入图片描述
后来我猜测是Jdk版本的问题,这本书是基于Java SE5/6,而我使用的是Jdk 8,所以我安装了Jdk5和Jdk6,分别创建了项目测试这段代码,果然出现了问题,如下:
在这里插入图片描述
控制台报错如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Type mismatch: cannot convert from List<Powder> to List<Snow>

	at AsListInference.main(AsListInference.java:32)

显然,当试图创建snow2时,Arrays.asList中只有Powder类型,因此它会创建List< Powder >而不是List < Snow >
因此,这几句话描述的情形存在于旧版本的Jdk中,经测试Jdk7同样会出现这种报错,但是Jdk8以上版本应该是不会出现这种情形的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值