【发布时间】:2017-04-03 20:37:04
【问题描述】:
我正在尝试将 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";
}
}
在 java 7 中它工作正常,在 java 8 中我得到:
java.lang.ClassCastException:java.lang.String 无法转换为 tests.Tests$ComparableMap
如果我将一个函数定义更改为:
private static <T> T getString(){
return (T) "aaa";
}
编译将失败:错误:
对 func 的引用不明确
为什么 Java 8 编译器在第一种情况下没有失败? (在我看来是错误的) 是否可以更改第二个重载函数,以便在不更改调用本身的情况下使用可变参数调用第一个函数?
【问题讨论】:
-
@AndrewTobilko 我不认为这是一个正确的重复,因为这里的 OP 在 Java 8 中出现运行时错误,而在可能的重复中它是 Java 8 中的编译错误。
-
使用原始类型 + 声明返回泛型
T调用者想要的方法 + 重载方法和可变参数;相当爆炸性的设置。 This question 解释了 Java 8 中的错误,并补充说func(ComparableMap)比func(Comparable...)更具体。
标签: java generics java-8 variadic-functions overload-resolution