java 对 的引用不明确,Java类型推断:在Java 8中引用不明确,但在Java 7中不是

本文详细探讨了在Java7中遇到的编译器警告和错误,特别是涉及类型转换的问题。当尝试将一个基类对象转换为派生类时,由于类型擦除和泛型的限制,可能会导致编译器警告或运行时异常。文章通过示例代码解释了编译器如何处理这种不确定性,并指出了Java8和Java7在类型推断上的差异,强调了在进行类型转换时确保类型安全的重要性。
摘要由CSDN通过智能技术生成

25bb24db68d960593b14ba7829d5a89f.png

当年话下

好吧,这似乎不是Java7乐于运行它的。在给出错误之前,它会给出一些警告:jatin@jatin-~$ javac -Xlint:unchecked -source 1.7 com/company/Main.java warning: [options] bootstrap class path not set in conjunction with -source 1.7com/company/Main.java:19: error: no suitable method found for set(Derived,Base)        set(new Derived(), new Consumer().get());        ^    method Consumer.set(Base,Derived) is not applicable      (argument mismatch; Base cannot be converted to Derived)    method Consumer.set(Derived,Collection extends Consumer>) is not applicable      (argument mismatch; Base cannot be converted to Collection extends Consumer>)com/company/Main.java:28: warning: [unchecked] unchecked cast        return (T) new Derived();                   ^  required: T  found:    Derived  where T is a type-variable:    T extends Base declared in method get()问题是这样的:set(new Derived(), new Consumer().get());当我们做的时候new Consumer().get(),如果我们看签名get。它返回一个Type T。我们知道T某种程度上可以扩展Base。但是我们不知道T具体是什么。可以是任何东西。因此,如果我们不能明确决定是什么T,那么编译器又如何呢?告诉编译器的一种方式,是硬编码,并通过明确告诉它:set(new Derived(), new Consumer().get());。尝试执行此操作时,上述原因极为危险(有意重复):class NewDerived extends Base {     public String getName(){return "name";};}NewDerived d = new Consumer().get();System.out.println(d.getName());在Java7(或任何Java版本)中,它将在运行时引发异常:线程“主”中的异常java.lang.ClassCastException:com.company.Derived无法转换为com.company.NewDerived因为get返回类型的对象,Derived但是您向编译器提到了它的类型NewDerived。它不能正确地将Derived转换为NewDerived。这就是为什么它显示警告。根据错误,现在我们了解出了什么问题new Consumer().get()。它的类型是something that extends base。这样做会set(new Derived(), new Consumer().get());寻找一种将参数作为的方法Derived (or any super class of it), something that extends Base。现在,您的两个方法都符合第一个参数的条件。根据第二个参数something that extends base,两者都符合条件,因为某些东西可以派生或扩展Derived或扩展Collection。这就是Java8引发Error的原因。按照Java7,其类型推断要弱一些。所以它尝试做类似的事情,Base base = new Consumer().get();set(new Derived(), base);再次,它找不到正确的方法Derived, Base作为参数。因此,它抛出错误,但原因不同:    set(new Derived(), new Consumer().get());    ^method Consumer.set(Base,Derived) is not applicable  (argument mismatch; Base cannot be converted to Derived)method Consumer.set(Derived,Collection extends Consumer>) is not applicabl e  (argument mismatch; Base cannot be converted to Collection extends Consu mer>)PS:感谢Holger指出我的答案不完整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值