我有两个非常相似的方法,我想合并它们(在泛型的帮助下)。但是,它们具有不同的返回类型。我该怎么办?
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;
}
答案 0 :(得分:1)
在Java 7中,您无法单独通过返回类型进行区分.Java 6有一个允许您执行此操作的错误,但我不建议您使用它。
这意味着你不能在没有返回类型Object
的情况下合并它们,也不能进行未经检查的强制转换,这不是一个好主意。
在你的例子中,我会使方法名称不同,所以很明显你会得到第一个或第二个。
答案 1 :(得分:0)
您不能有两个具有相同名称和相同参数的方法。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以将方法的返回类型更改为A
和B
使用的公共类。但是,假设A
和B
都延伸Base
,您可以使用此功能:
public static BaseClass veggie(MyList <Box<A, B>> b, int j) {
BaseClass veggie;
// Do things
return veggie;
}
由于您想合并这两种方法,我认为A
和B
有一些共同点。如果不是这种情况,您可以使用Object
类作为返回类型。
答案 4 :(得分:0)
将方法返回类型更改为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
}
答案 5 :(得分:0)
在这种情况下,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;
}
因此,如果你想要合并它们,你需要将一个参数传递给指定你想要第一个还是第二个的方法。
例如:
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;
}