使用三元运算符调用重载方法?
Call Overloaded methods with ternary operator?
使用三元运算符检查instanceOf
不能调用重载方法的规则是什么?
这可能是一个愚蠢的问题,但我不想对这条规则进行解释。您可以在屏幕截图中看到,我无法使用三元运算符来引用多个方法。
public class Sample {
public static void main(String[] args) {
Object object = new String("");
Foo.load(object instanceof Integer ? (Integer) object :
object instanceof String ? (String) object : null);
}
public static class Foo {
public static void load(String s) {
//
}
public static void load(Integer s) {
//
}
}
}
Object obj = getObject();
if(obj instanceof Integer)
load((Integer)obj);
else if(obj instanceof String)
load((String)obj);
else
load(obj);
错误,因为在编译时选择了重载方法,但不是运行时,当你使用instanceof
.要将此检查移动到运行时,请使用例如if...else
.
提示
load(obj instanceof String ? (String)obj : obj);
这没问题,不会抛出编译错误,但你觉得呢,当obj = "some string"
、load(String s)
时,会调用哪个重载方法???
否!!! load(Object s)
String
和 Object
实例。
方法解析在编译 时间内完成。在一天结束时,您将一些 return 是一个值的表达式传递给方法。编译器检查表达式的类型并确定它应该调用哪个方法。
在这里,您试图根据 运行时 信息编写一个可能 return 不同类型的表达式,并相应地调用一个方法。正如你所看到的,这不会飞。相反,您可以根据类型显式调用不同的方法(它们具有相同名称的事实无关紧要 - 它们仍然是不同的方法!):
if (object instanceof Integer) {
Foo.load((Integer) object); // Calls Foo.load(Integer)
} else if (object instanceof String) {
Foo.load((String) object); // Calls Foo.load(String)
} else {
Foor.load(object); // Calls Foo.load(Object)
}
在您的情况下,空字符串或 null 不会测试引用相等性。
如果Object object = new String("test");
,您的解决方案将有效
有吗
此外,对于像 int、float 等原始类型,您实际上并不需要 instanceof.. instanceof 更适合 类。
这里 link 介绍了 instanceof 的真正工作原理:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
使用三元运算符检查instanceOf
不能调用重载方法的规则是什么?
这可能是一个愚蠢的问题,但我不想对这条规则进行解释。您可以在屏幕截图中看到,我无法使用三元运算符来引用多个方法。
public class Sample {
public static void main(String[] args) {
Object object = new String("");
Foo.load(object instanceof Integer ? (Integer) object :
object instanceof String ? (String) object : null);
}
public static class Foo {
public static void load(String s) {
//
}
public static void load(Integer s) {
//
}
}
}
Object obj = getObject();
if(obj instanceof Integer)
load((Integer)obj);
else if(obj instanceof String)
load((String)obj);
else
load(obj);
错误,因为在编译时选择了重载方法,但不是运行时,当你使用instanceof
.要将此检查移动到运行时,请使用例如if...else
.
提示
load(obj instanceof String ? (String)obj : obj);
这没问题,不会抛出编译错误,但你觉得呢,当obj = "some string"
、load(String s)
时,会调用哪个重载方法???
否!!! load(Object s)
String
和 Object
实例。
方法解析在编译 时间内完成。在一天结束时,您将一些 return 是一个值的表达式传递给方法。编译器检查表达式的类型并确定它应该调用哪个方法。
在这里,您试图根据 运行时 信息编写一个可能 return 不同类型的表达式,并相应地调用一个方法。正如你所看到的,这不会飞。相反,您可以根据类型显式调用不同的方法(它们具有相同名称的事实无关紧要 - 它们仍然是不同的方法!):
if (object instanceof Integer) {
Foo.load((Integer) object); // Calls Foo.load(Integer)
} else if (object instanceof String) {
Foo.load((String) object); // Calls Foo.load(String)
} else {
Foor.load(object); // Calls Foo.load(Object)
}
在您的情况下,空字符串或 null 不会测试引用相等性。
如果Object object = new String("test");
,您的解决方案将有效
有吗
此外,对于像 int、float 等原始类型,您实际上并不需要 instanceof.. instanceof 更适合 类。
这里 link 介绍了 instanceof 的真正工作原理: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html