2010-12-07 4 views
1

У меня есть два класса (А и В) с одинаковыми методами (Foo):Java: различные интерфейсы дженериков

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

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

Я хочу, чтобы сделать общий класс, который может вызывать этот метод. Но у меня есть две идеи, как сделать это во время выполнения и иметь не представления о времени компиляции:

  1. проверку типа и приведение к А или Б.

  2. Получ.

Мой пример родовое, который вызывает 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> { 
... 
} 

Обратите внимание, что я не являюсь создателем классов «А» и «Б».

ответ

5

Вам нужно будет заставить оба класса реализовать общий интерфейс, объявляющий метод foo. Java не поддерживает так называемую «утиную печать», которая была бы здесь полезной.

+0

Действительно. Без интерфейса (или суперкласса) способ * только * сделать это будет через отражение, дженерики или нет. – 2010-12-07 09:14:09

0

Возможно, вы можете просто создать класс ABAbstract в качестве родительского типа для A и B. Затем вы можете использовать этот класс в качестве аргумента или остаться с помощью Genercard Generics и передать его в ABAbstract. Вы также можете позволить обеим классам A и B реализовать интерфейс, объявляющий метод foo. Вероятно, это был бы самый простой способ сделать ваш компилятор не выкидывать ошибок и идти именно так, как вы сказали «вы искали».

Но я thinky Ты должен написать:

public class Template<T extends ABInterface> { 

, но я не уверен, что определенно об этом. Также может быть реализовано, что классы должны использовать ключевое слово.

4

Вам нужно будет создать интерфейс и позволить вашему шаблону принять любой класс, который реализует интерфейс.

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(); 
    } 
} 
+0

Я не создатель классов А и В. – Vlad 2010-12-08 16:12:31

Смежные вопросы