Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Java方法中如何有两种不同的返回类型?_Java_Generics_Methods_Merge - Fatal编程技术网

我的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,但我不建议您使用它

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


      在您的示例中,我将使方法名称不同,这样就可以清楚地看到您将得到第一个或第二个方法。

      在Java 7中,您无法仅通过返回类型来区分。Java6有一个允许您这样做的bug,但我不建议您使用它

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


      在您的示例中,我将使方法名称不同,这样您就可以清楚地得到第一个或第二个。

      您可以将方法的返回类型更改为一个公共类,该类由
      a
      B
      使用。但是,假设
      A
      B
      extend
      Base
      ,您可以使用:

      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
      extend
      Base
      ,您可以使用:

      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