我在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
答案 0 :(得分:7)
true ? "Must be a string" : new Object()
应该有一种类型的退货。在这种情况下,编译器将为返回的元素选择类层次结构中的最高类,即Object
。
答案 1 :(得分:2)
在三元运算符中,表达式的返回类型应该相同。但编译器选择最高级别的层次结构,如果发生任何冲突,则为new object()
。
条件表达式的类型确定如下:
如果第二个和第三个操作数具有相同的类型(可能是 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没有匹配,然后它尝试将类型转换为父默认对象类型。