编译器会根据泛型方法传入的实参自动推断形参的值,通常会推断出最直接的类型参数。

为了让编译器可以推断出泛型类型,不要让编译器迷惑,否则就会出错。

public class ErrorTest {
    static <T> void test(Collection<T> from,Collection<T> to) {
        for (T ele : from){
            to.add(ele);
        }
    }

    public static void main(String[] args) {
        List<String> as = new ArrayList<>();
        List<Object> ao = new ArrayList<>();
        //The method test(Collection<T>, Collection<T>) 
        //in the type ErrorTest is not applicable for 
        //the arguments (List<Object>, List<String>)
        //test(as, ao);
    }
}

可以进行如下修改,避免编译失败。

public class ErrorTest {
    static <T> void test(Collection<? extends T> from,Collection<T> to) {
        for (T ele : from){
            to.add(ele);
        }
    }

    public static void main(String[] args) {
        List<String> ao = new ArrayList<>();
        List<Object> as = new ArrayList<>();
        test(ao, as);
    }
}