Strange behavior when overloading methods in Java
我今天遇到了这种奇怪的行为(在我看来)。参加这个简单的测试课程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Test { public static void main(String[] args) { Test t = new Test(); t.run(); } private void run() { List<Object> list = new ArrayList<Object>(); list.add(new Object()); list.add(new Object()); method(list); } public void method(Object o) { System.out.println("Object"); } public void method(List<Object> o) { System.out.println("List of Objects"); } } |
它按照您期望的方式运行,打印"对象列表"。但如果您更改以下三行:
1 2 3 | List<String> list = new ArrayList<String>(); list.add(""); list.add(""); |
你将得到"对象"。
我尝试了其他一些方法,得到了同样的结果。这是错误还是正常行为?如果这是正常的,有人能解释为什么吗?
谢谢。
这是正常的行为。
如果
1 2 3 |
另外请注意,数组有不同的行为——
这是正常的行为,因为当您用泛型定义签名时,您指定了一个类。(除非您使用通配符,而您没有使用通配符,否则链接将解释)……
所以
好吧,这是意料之中的——这个列表不是
1 | public void method(List<?> o) |
作为外卡,这将匹配您的列表。
您需要了解Java泛型。
正如预期的那样,因为
1 2 3 | public void method(List<? extends Object> o) { //or an unbounded wildcard List<?> System.out.println("List of Objects"); } |
也见
- Java语言指南/泛型/更有趣的通配符