接受多个类型作为单个参数的Java方法

时间:2012-12-20 19:15:06

标签: java generics types

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

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()方法?

5 个答案:

答案 0 :(得分:13)

在接口中定义所需的行为,让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();
    }
}

答案 1 :(得分:5)

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

interface Thinker {
   public void think();
}

然后让你的类实现它:

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

并将其用作参数类型:

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

答案 2 :(得分:5)

Thinker定义为接口:

public interface Thinker
{
    public void think();
}

然后让课程AB实现它:

public class A
implements Thinker

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

答案 3 :(得分:1)

您可以创建一个包含think方法的公共界面,让AB实现它。

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

答案 4 :(得分:1)

在这种情况下,您可以简单地使用多态性。为此,您需要重载方法 - 创建具有相同名称但不同参数类型的方法。 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

正如您所看到的,两种方法签名不同,因此没有错误。 请注意,这只是一个可以做什么的例子。