Java:泛型中的不同接口

时间:2010-12-07 09:05:45

标签: java generics

我有两个类(A和B),方法相同(foo):

public class A {
 public String foo() {
  return "A said foo";
 }
}

public class B {
 public String foo() {
  return "B said foo";
 }
}

我想创建可以调用此方法的泛型类。但是我有两个想法如何在运行时执行此操作并且没有关于编译时的想法:

  1. 检查类型并转换为A或B.

  2. 获取方法。

  3. 我调用getMethod的通用示例:

    public class Template<T> {
     private T mT;
    
     public Template(T t) {
      mT = t;
     }
    
        public String bar() {
         String result = "no result";
      try {
          Method m = mT.getClass().getMethod("foo", null);
       result = (String)m.invoke(mT);
      } catch (Exception e) {
       result = e.toString();
       e.printStackTrace();
      }
      return result;
        }
    }
    

    还有另外一种方法吗? 我正在寻找这样的东西:

    public class Template<T extends A | B> {
    ...
    }
    

    请注意,我不是“A”和“B”类的创建者。

3 个答案:

答案 0 :(得分:5)

你必须让这两个类实现一个声明foo方法的通用接口。 Java不支持所谓的“duck typing”,这在这里会有所帮助。

答案 1 :(得分:4)

您必须创建一个接口,让您的Template接受任何实现该接口的类。

interface Foo{
    public String foo();
}

public class A implements Foo {
    public String foo() {
        return "A said foo";
    }
}

public class B implements Foo{
    public String foo() {
        return "B said foo";
    }
}

public class Template<T extends Foo> {
    private T mT;

    public Template(T t) {
        mT = t;
    }
    public String bar() {
        return mT.foo();
    }
}

答案 2 :(得分:0)

您可能只需将ABAbstract类作为A和B的父类型。 您可以使用此类作为参数,或者使用Wildcard Generics并将其转换为ABAbstract。 你也可以让A类和B类都实现一个声明方法foo的接口。这可能是让你的编译不会抛出任何错误的最简单的方法,并且完全符合你所说的“你正在寻找”。

但我认为你不得不写:

public class Template<T extends ABInterface> {

但我对这一点并不十分肯定。 它也可以是类,需要使用关键字实现。