如何在Java方法中使用两种不同的返回类型?

时间:2013-01-10 11:44:48

标签: 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<A, B>> b, int j) {

        B veggieB = b.head.second;
        return veggieB;
    }

6 个答案:

答案 0 :(得分:1)

在Java 7中,您无法单独通过返回类型进行区分.Java 6有一个允许您执行此操作的错误,但我不建议您使用它。

这意味着你不能在没有返回类型Object的情况下合并它们,也不能进行未经检查的强制转换,这不是一个好主意。

在你的例子中,我会使方法名称不同,所以很明显你会得到第一个或第二个。

答案 1 :(得分:0)

您不能有两个具有相同名称和相同参数的方法。

请参阅Method Overloading

Java overloading rules

Java overloading and inheritance rules

答案 2 :(得分:0)

  • 您不能声明方法可以返回类型X或类型Y,除非 X或Y是另一个的超类型(在这种情况下是其他的 也可以返回子类型)
  • 您不能声明两种仅在返回类型
  • 方面不同的方法

答案 3 :(得分:0)

您可以将方法的返回类型更改为AB使用的公共类。但是,假设AB都延伸Base,您可以使用此功能:

public static BaseClass veggie(MyList <Box<A, B>> b, int j) {
    BaseClass veggie;
    // Do things
    return veggie;
}

由于您想合并这两种方法,我认为AB有一些共同点。如果不是这种情况,您可以使用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;
}