我的Java方法中如何有两种不同的返回类型?
我有两个非常相似的方法,我想合并它们(借助泛型)。但是,它们有不同的返回类型。我能做什么我的Java方法中如何有两种不同的返回类型?,java,generics,methods,merge,Java,Generics,Methods,Merge,我有两个非常相似的方法,我想合并它们(借助泛型)。但是,它们有不同的返回类型。我能做什么 public static <A, B> A veggie(MyList <Box<A, B>> b, int j) { A veggieA = b.head.first; return veggieA; } public static <A, B> B veggie2(MyList <Box&
public static <A, B> A veggie(MyList <Box<A, B>> b, int j) {
A veggieA = b.head.first;
return veggieA;
}
public static <A, B> B veggie2(MyList <Box<A, B>> b, int j) {
B veggieB = b.head.second;
return veggieB;
}
publicstatica素食者(MyList b,int j){
A蔬菜A=b头先;
回归蔬菜;
}
公共静态B蔬菜2(MyList B,int j){
B vegigieb=B.head.second;
返回蔬菜;
}
不能有两个名称和参数相同的方法
看
不能有两个名称和参数相同的方法 看
- 您不能声明方法可以返回类型X或类型Y,除非 X或Y是另一个的超类型(在这种情况下是另一个) 也可以返回子类型)
- 不能声明两个只在返回类型上不同的方法
- 您不能声明方法可以返回类型X或类型Y,除非 X或Y是另一个的超类型(在这种情况下是另一个) 也可以返回子类型)
- 不能声明两个只在返回类型上不同的方法
对象
或未经检查的强制转换(这不是一个好主意)的情况下合并它们
在您的示例中,我将使方法名称不同,这样就可以清楚地看到您将得到第一个或第二个方法。在Java 7中,您无法仅通过返回类型来区分。Java6有一个允许您这样做的bug,但我不建议您使用它 这意味着您不能在不进行返回类型
对象
或未经检查的强制转换(这不是一个好主意)的情况下合并它们
在您的示例中,我将使方法名称不同,这样您就可以清楚地得到第一个或第二个。您可以将方法的返回类型更改为一个公共类,该类由
a
和B
使用。但是,假设A
和B
extendBase
,您可以使用:
public static BaseClass veggie(MyList <Box<A, B>> b, int j) {
BaseClass veggie;
// Do things
return veggie;
}
公共静态基类素食者(MyList b,int j){
基类蔬菜;
//做事
还素;
}
由于您希望合并这两种方法,我认为
A
和B
有一些共同点。如果不是这样,您可以使用对象
类作为返回类型 您可以将方法的返回类型更改为a
和B
都使用的公共类。但是,假设A
和B
extendBase
,您可以使用:
public static BaseClass veggie(MyList <Box<A, B>> b, int j) {
BaseClass veggie;
// Do things
return veggie;
}
公共静态基类素食者(MyList b,int j){
基类蔬菜;
//做事
还素;
}
由于您希望合并这两种方法,我认为
A
和B
有一些共同点。如果不是这样,您可以使用对象
类作为返回类型 将方法返回类型更改为object。使用instanceof
运算符可以进行区分
示例
public static Object veggie(MyList <Box<A, B>> b, int j) {
if(some_condition){
A veggieA = b.head.first;
return veggieA;
}else{
B veggieB = b.head.second;
return veggieB;
}
}
.
.
.
Object obj=veggie(b,j);
if (obj instanceof <A, B> A) {
do something
else{
do something
}
公共静态对象veggie(MyList b,int j){
如果(某些条件){
A蔬菜A=b头先;
回归蔬菜;
}否则{
B vegigieb=B.head.second;
返回蔬菜;
}
}
.
.
.
对象obj=素食者(b,j);
if(A的obj实例){
做点什么
否则{
做点什么
}
将方法返回类型更改为object。使用instanceof
运算符可以区分
示例
public static Object veggie(MyList <Box<A, B>> b, int j) {
if(some_condition){
A veggieA = b.head.first;
return veggieA;
}else{
B veggieB = b.head.second;
return veggieB;
}
}
.
.
.
Object obj=veggie(b,j);
if (obj instanceof <A, B> A) {
do something
else{
do something
}
公共静态对象veggie(MyList b,int j){
如果(某些条件){
A蔬菜A=b头先;
回归蔬菜;
}否则{
B vegigieb=B.head.second;
返回蔬菜;
}
}
.
.
.
对象obj=素食者(b,j);
if(A的obj实例){
做点什么
否则{
做点什么
}
在这种情况下,类A和类B必须实现相同的接口,例如C。
当A和B实现C时,您可以编写:
public static <C, A extends C, B extends C> C veggie1(MyList <Box<A, B>> b, int j) {
C veggieA = b.head.first;
return veggieA;
}
public static <C, A extends C, B extends C> C veggie2(MyList <Box<A, B>> b, int j) {
C veggieB = b.head.second;
return veggieB;
}
publicstaticcvegige1(MyList b,intj){
C veggieA=b.头先;
回归蔬菜;
}
公共静态C蔬菜2(MyList b,int j){
C veggieB=b.头秒;
返回蔬菜;
}
因此,如果您现在想要合并它们,您需要向方法传递一个参数,该参数指定您想要第一个还是第二个
例如:
public static <C, A extends C, B extends C> C veggie(MyList <Box<A, B>> b, int j, boolean first) {
C veggie;
if (first)
veggie = b.head.first;
else
veggie = b.head.second;
return veggie;
}
public static C veggie(MyList b,int j,布尔值优先){
C素食者;
如果(第一)
素食者=b.头.第一;
其他的
素食者=头秒;
还素;
}
在这种情况下,类A和类B必须实现相同的接口,例如C。
当A和B实现C时,您可以编写:
public static <C, A extends C, B extends C> C veggie1(MyList <Box<A, B>> b, int j) {
C veggieA = b.head.first;
return veggieA;
}
public static <C, A extends C, B extends C> C veggie2(MyList <Box<A, B>> b, int j) {
C veggieB = b.head.second;
return veggieB;
}
publicstaticcvegige1(MyList b,intj){
C veggieA=b.头先;
回归蔬菜;
}
公共静态C蔬菜2(MyList b,int j){
C veggieB=b.头秒;
返回蔬菜;
}
因此,如果您现在想要合并它们,您需要向方法传递一个参数,该参数指定您想要第一个还是第二个
例如:
public static <C, A extends C, B extends C> C veggie(MyList <Box<A, B>> b, int j, boolean first) {
C veggie;
if (first)
veggie = b.head.first;
else
veggie = b.head.second;
return veggie;
}
public static C veggie(MyList b,int j,布尔值优先){
C素食者;
如果(第一)
素食者=b.头.第一;
其他的
素食者=头秒;
还素;
}
它们没有相同的名称:veggie&veggie2!在什么条件下您将决定何时返回A
和何时返回B
?它们没有相同的名称:veggie&veggie2!在什么条件下您将决定何时返回A
和何时返回B
?