假设我们有2节课.一个空类Base,以及该类的子类Derived.
public class Base {}
public class Derived extends Base {}
Run Code Online (Sandbox Code Playgroud)
然后我们在另一个类中有几个方法:
import java.util.Collection
public class Consumer {
public void test() {
set(new Derived(), new Consumer().get());
}
public <T extends Base> T get() {
return (T) new Derived();
}
public void set(Base i, Derived b) {
System.out.println("base");
}
public void set(Derived d, Collection<? extends Consumer> o) {
System.out.println("object");
}
}
Run Code Online (Sandbox Code Playgroud)
这在Java 7中成功编译并运行,但不能在Java 8中编译.错误:
Error:(8, 9) java: reference to set is ambiguous
both method set(Base,Derived) in Consumer …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Java 7代码迁移到Java 8,所以我的代码类似于:
package tests;
import java.util.Arrays;
import java.util.Map;
public class Tests {
private static interface ComparableMap<K,V> extends Map<K,V>, Comparable {}
public static void main(String[] args) {
func(getString());
}
private static void func(Comparable...input){
System.out.println(Arrays.toString(input));
}
private static void func(ComparableMap <?,?> m){
System.out.println(m);
}
private static <T extends Comparable> T getString(){
return (T) "aaa";
}
}
Run Code Online (Sandbox Code Playgroud)
在java 7中它正常工作,在Java 8中我得到:
java.lang.ClassCastException:java.lang.String无法强制转换为tests.Tests $ ComparableMap
如果我将一个函数定义更改为:
private static <T> T getString(){
return (T) "aaa";
}
Run Code Online (Sandbox Code Playgroud)
编译将失败:错误:
对func的引用含糊不清
为什么Java 8编译器在第一种情况下没有失败?(看起来对我来说是错误的)是否可以更改第二个重载函数,以便在不更改调用本身的情况下使用varargs参数调用第一个函数?