【问题标题】:Strange behavior when overloading methods in Java在 Java 中重载方法时的奇怪行为
【发布时间】:2011-02-26 03:06:29
【问题描述】:

我今天遇到了这种奇怪的(在我看来)行为。学习这个简单的测试类:

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");
}
}

它的行为符合您的预期,打印“对象列表”。但是如果你改变以下三行:

List<String> list = new ArrayList<String>();
list.add("");
list.add("");

你会得到“对象”。

我尝试了其他几种方法并得到了相同的结果。这是一个错误还是正常行为?如果是正常的,谁能解释一下原因?

谢谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    这是正常行为。 List&lt;String&gt; 不是List&lt;Object&gt;,所以method(Object) 是唯一适用的方法。

    如果List&lt;String&gt;List&lt;Object&gt;,您将能够违反类型安全,例如,通过将Integer 添加到List&lt;String&gt;(并且由于类型擦除而无法在运行时捕获) :

    public void method(List<Object> o) { 
        o.add(new Integer(10));
    }
    

    另请注意,数组具有不同的行为 - String[]Object[],因为数组知道其元素类型,如果您尝试将错误的对象放入其中,则会引发运行时异常。

    【讨论】:

      【解决方案2】:

      这是正常行为,因为当您使用泛型定义签名时,您指定了一个类。 (除非您使用wildcards,否则链接说明)...

      所以List&lt;String&gt; 不是List&lt;Object&gt;。不过,它是 List&lt;? extends Object&gt; - 试试看吧。

      【讨论】:

        【解决方案3】:

        这是意料之中的——列表不是List&lt;Object&gt; 类型。要获得您期望的结果,请使用:

        public void method(List<?> o)
        

        作为通配符,这将匹配您的列表。

        【讨论】:

          【解决方案4】:

          您需要了解 java 泛型。 List&lt;String&gt; 不是 List&lt;Object&gt;Any simple way to explain why I cannot do List<Animal> animals = new ArrayList<Dog>()?

          【讨论】:

            【解决方案5】:

            正如预期的那样,因为List&lt;String&gt; 不是List&lt;Object&gt;,如另一个答案中所述。要获得所需的行为,您需要使用通配符:

            public void method(List<? extends Object> o) { //or an unbounded wildcard List<?>
                System.out.println("List of Objects");
            }
            

            另见

            【讨论】:

              猜你喜欢
              • 2013-01-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-07
              • 2015-12-01
              相关资源
              最近更新 更多