编译器会根据泛型方法传入的实参自动推断形参的值,通常会推断出最直接的类型参数。
为了让编译器可以推断出泛型类型,不要让编译器迷惑,否则就会出错。
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); } }