小编Ale*_*poy的帖子

Java 8泛型函数应该是模糊的,但在运行时失败

我正在尝试将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参数调用第一个函数?

java generics variadic-functions overload-resolution java-8

7
推荐指数
1
解决办法
259
查看次数