【发布时间】:2015-04-17 06:56:28
【问题描述】:
以下代码在使用 sourceCompatibility=1.7 或 1.6 编译时有效,但在切换到 1.8 后失败:
public class Java8Wat {
interface Parcelable {
}
static class Bundle implements Parcelable {
public void put(Parcelable parcelable) {
}
public void put(Serializable serializable) {
}
public <T extends Parcelable> T getParcelable() {
return null;
}
}
static {
Bundle inBundle = new Bundle();
Bundle outBundle = new Bundle();
outBundle.put(inBundle.getParcelable());
}
}
编译输出:
Java8Wat.java:23: error: reference to put is ambiguous
outBundle.put(inBundle.getParcelable());
^
both method put(Parcelable) in Bundle and method put(Serializable) in Bundle match
这是代码失败的仓库:https://github.com/chalup/java8-wat。只需从项目目录调用./gradlew clean build。
我浏览了 Java 8 的 JLS,但没有找到任何相关内容。
补充观察:如果我将getParcelable() 签名更改为:
public Parcelable getParcelable()
为什么 java 编译器认为put(Serializable) 是outBundle.put(inBundle.getParcelable()) 调用的潜在适用方法,应该对 Parcelable/Bundle 类进行哪些更改?额外问题:为什么这个错误只发生在 Java 8 上而不发生在 Java 7 上?
【问题讨论】:
-
我要发布一个答案。那好吧。 ;p