我是Java的新手并试图理解以下代码:
int someMethod() {
return (true ? null : 0);
}
方法的返回类型是int
,但它可以返回null
和int
,这是Java中的正确行为吗? Java方法可以返回多种类型吗?对于那些经验丰富的人来说,这可能听起来很愚蠢,但我刚刚迈出了Java的第一步。
答案 0 :(得分:6)
方法不能返回多种类型。
如果方法没有返回任何内容,方法的签名包含返回类型或void
。由于必须在方法签名中定义,因此必须返回该类型的内容。
代码
return (true ? null : 0);
是一个简写的if-else语句或条件三元表达式,可以重写为:
if (true) {
return null;
}
else {
return 0;
}
但是,上面的代码不会编译,因为如果返回类型是primitive type ,则无法返回null
int
。上面的代码将编译,因为JVM将尝试将null转换为int
。在运行时,它会抛出NullPointerException
,pointed out by Eran。
要返回多种类型',您可以执行以下操作:
public class BooleanOrInt {
private boolean isInteger; // Whether value is boolean or int
private boolean b;
private int i;
public BooleanOrInt(boolean b) {
this.b = b;
this.isInteger = false;
}
public BooleanOrInt(int i) {
this.i = i;
this.isInteger = true;
}
public boolean isInteger() {
return this.isInteger;
}
}
然后您的代码应如下所示:
BooleanOrInt methodOfA() {
if (some_condition) {
return new BooleanOrInt(the_boolean_you_want);
}
else {
return new BooleanOrInt(the_integer_you_want);
}
}
答案 1 :(得分:5)
这是一个条件三元表达式,这意味着该方法返回?
之后的两个值中的一个,具体取决于他在?
之前出现的条件的评估(在您的情况下总是返回true
)。
表达式(true ? null : 0)
的类型为Integer
,因为这是null
和0
的常见类型。
您的代码将抛出NullPointerException
,因为当您在返回类型为null
的方法中返回Integer
int
时,JVM会尝试转换Integer
1}}到int
并失败。
为了修复此代码,您必须将返回类型更改为Integer
(这是用作int
基元类型的包装的引用类型):
Integer methodOfA()
{
return (true ? null : 0);
}
答案 2 :(得分:0)
Java方法不能以您建议的形式返回多个类型。但是,它可以返回任意数量的子类型。在您的情况下,int是基本类型,它不能有子类型。这里不能返回null,因为null只能由返回类型为对象的方法返回。对于基元,您必须指定一些值(在您的情况下为0)。