1

我有两种非常相似的方法,我想将它们合并(在泛型的帮助下)。但是,它们具有不同的返回类型。我能做些什么?

    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;
    }
4

6 回答 6

1

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

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

在您的示例中,我会使方法名称不同,因此很明显您将获得第一个或第二个。

于 2013-01-10T11:51:17.393 回答
0

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

请参阅方法重载

Java重载规则

Java重载和继承规则

于 2013-01-10T11:49:58.293 回答
0
  • 您不能声明一个方法可以返回类型 X 或类型 Y,除非 X 或 Y 是另一个的超类型(在这种情况下也可以返回其他子类型)
  • 您不能声明两种仅在返回类型上有所不同的方法
于 2013-01-10T11:50:49.317 回答
0

A您可以将方法的返回类型更改为和都使用的公共类B。但是,假设两者都可以使用AB扩展Base您可以使用:

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

当你想合并这两种方法时,我想这AB一些共同点。如果不是这种情况,您可以使用Object该类作为返回类型。

于 2013-01-10T11:51:24.570 回答
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;
}
于 2013-01-10T13:11:20.387 回答
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
}
于 2013-01-10T12:20:48.590 回答