Java重载的奇怪行为

时间:2014-08-29 14:56:23

标签: java dynamic parameters overloading

我在java重载和动态参数方面遇到了一些问题..

import java.lang.*;

public class Program
{
     public static void main(String []args){
        testOverloading("Test string");
        testOverloading(new Object());
        testOverloading( true ? "Must be a string" : new Object());
     }

     public static void testOverloading(String test) {
         System.out.println("it's a string");
     }

     public static void testOverloading(Object test) {
         System.out.println("it's an object");
     }

}

运行此代码,java假设“true?”必须是字符串“:new Object()”是一个对象而不是一个字符串..输出如下:

it's a string
it's an object
it's an object

对于这类问题有解决方案/解释吗?

更新

我也尝试使用不同的方法:

变化:

testOverloading( true ? "Must be a string" : new Object());

in

testOverloading( true ? "Must be a string" : new Program());

public static void testOverloading(Object test) {

public static void testOverloading(Program test) {

,输出为:

error: no suitable method found for testPoly(Object)

所以我假设这是一个编译器限制,参数使用单行条件

实际上使用normal是正确的输出:

    if (true)
        testOverloading("Must be a string");
    else
        testOverloading(new Object());

output: it's a string

5 个答案:

答案 0 :(得分:7)

true ? "Must be a string" : new Object()应该有一种类型的退货。在这种情况下,编译器将为返回的元素选择类层次结构中的最高类,即Object

答案 1 :(得分:2)

在三元运算符中,表达式的返回类型应该相同。但编译器选择最高级别的层次结构,如果发生任何冲突,则为new object()

Java docs说:

  

条件表达式的类型确定如下:

     

如果第二个和第三个操作数具有相同的类型(可能是   null type),那就是条件表达式的类型。

答案 2 :(得分:2)

无法知道您的三元运算符是否会在编译时返回字符串或对象,因此编译器会选择层次结构中最高类的类型,在本例中为对象。

您可以通过尝试将三元运算符的结果赋值给String变量来更好地理解它,您将收到编译错误

前:

String result = true ? "Must be a string" : new Object(); // compiler error

答案 3 :(得分:1)

这并不奇怪。这是因为字符串是从对象继承的。由于return语句可以是object或string类型,因此它选择对象类型。如果你把它变成一个字符串,你会看到不同的行为。

你需要做这样的事情:

public class ReturnClass{
    Object object;
    ReturnType returnType;  


    public static Enum ReturnType {
        STRING,
        OBJECT   
    }
}

答案 4 :(得分:0)

在类似于语句的表达式中,字符串常量将由编译器使用StringBuilder构造。在一个例子中 真的吗? “必须是一个字符串”:new Object(),转向 真的吗? new StringBuilder(“必须是一个字符串”):new Object()。因此,StringBuilder没有匹配,然后它尝试将类型转换为父默认对象类型。