【问题标题】:Java method that accepts multiple types as a single parameter接受多种类型作为单个参数的 Java 方法
【发布时间】:2012-12-20 19:15:05
【问题描述】:

假设我有两个自定义类和一个方法如下:

class A {
  public void think() {
    // do stuff
  }
}

class B {
  public void think() {
    // do other stuff
  }
}

Class C {
  public void processStuff(A thinker) {
    thinker.think();
  }
}

有没有办法把processStuff()写成这样(只是举例说明):

public void processStuff({A || B} thinker) {...}

或者,换句话说,有没有一种方法可以编写一个接受多种类型的一个参数的方法,以避免多次键入processStuff() 方法?

【问题讨论】:

    标签: java generics types


    【解决方案1】:

    在接口中定义您想要的行为,让AB 实现接口,并声明您的processStuff 以将接口实例作为参数。

    interface Thinker {
        public void think();
    }
    
    class A implements Thinker {
        public void think() { . . .}
    }
    
    class B implements Thinker {
        public void think() { . . .}
    }
    
    class C {
        public void processStuff(Thinker thinker) {
            thinker.think();
        }
    }
    

    【讨论】:

    • 谢谢!这正是我所需要的
    • 对于 A 类和 B 类不受我们控制的情况(即作为外部库的一部分提供)的任何解决方法?
    • @phantomastray - 好吧,你可以定义包装类。例如:class WrapperA implements Thinker { private final A a; public WrapperA(A a) { this.a = a; } public void think() { /* think with a */ } }(同样适用于 B)。然后你可以传递包装类实例而不是外部库类实例。这不是一个完整的解决方法(您仍然无法将AB 传递给processStuff),但它可能会让您获得所需的部分。发布具有特定用例的问题可能会为您提供更好的建议。
    【解决方案2】:

    这种情况下,最简单的就是定义一个接口

    interface Thinker {
       public void think();
    }
    

    然后让你的类实现它:

    class A implements Thinker {
      public void think() {
        // do stuff
      }
    }
    

    并将其用作参数类型:

    Class C {
      public void processStuff(Thinker t) {
        t.think();
      }
    }
    

    【讨论】:

      【解决方案3】:

      Thinker定义为接口:

      public interface Thinker
      {
          public void think();
      }
      

      然后让 AB 类实现它:

      public class A
      implements Thinker
      

      最后,定义processStuff() 以将Thinker 作为参数。

      【讨论】:

        【解决方案4】:

        您可以创建一个包含think 方法的通用接口,并让AB 实现它。

        或者你可以重载processStuff() 并有两个实现,每个实现一个类。

        【讨论】:

          【解决方案5】:

          在这种情况下,您可以简单地使用多态。为此,您需要重载您的方法——创建具有相同名称但参数类型不同的方法。 java不检查方法名,它检查方法签名(方法名+参数+返回类型)例如:

          public class foo
          {
                 public int add(int a, int b)
                 {
                      int sum = a+b ;
                      return sum ; 
                 }
          
          
                 public String add(String a, String b)
                 {
                      String sum = a+b ;
                      return sum ; 
                 }
          
                 public static void main(String args[])
                 {
                      foo f = new foo() ;
                      System.out.printf("%s\n",f.add("alpha","bet));
                      System.out.printf("%d", f.add(1,2);
                 }
          
          
           }
          

          这段代码应该返回

          alphabet
          3
          

          如您所见,两个方法签名不同,因此没有错误。 请注意,这只是可以做的一个示例。

          【讨论】:

            猜你喜欢
            • 2016-01-25
            • 1970-01-01
            • 2012-06-02
            • 2012-05-28
            • 2016-09-23
            • 2017-09-28
            • 1970-01-01
            • 2016-09-18
            相关资源
            最近更新 更多