2012-10-26 2 views
1

У меня есть общий тип класса, T следующим образом:Java общие интерфейсы

class MyClass<T> 

Также я знаю, что T является интерфейс только с одним методом внутри, но я не знаю, что интерфейс, я не могу написать это :

class MyClass< T extends TheInterface > 

Так есть способ вызвать этот метод?

public void callMe(T me, Object...params){ 
    // How can I invoke T interface method? 
} 

Я пытался это:

public void callMe(T me, Object... params) { 
// methods.length is 244, just as in my activity class 
     Method[] methods = me.getClass().getMethods(); 
     try { 
      methods[0].invoke(me, params); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
      return; 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
      return; 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
      return; 


     } 
} 

Но это не работает

Edit: Я отправил новый question, что объясняет, почему мне это нужно для

+2

Что не работает г? Сообщение об ошибке – RNJ

+4

Не имея возможности заранее знать, какой интерфейс (или супер интерфейс) вы получите, звучит очень похоже на проблему в дизайне. Опираясь на размышления, чтобы назвать метод, редко бывает хорошей стратегией. Мой личный опыт подсказывает, что вы должны найти способ улучшить дизайн (возможно, используйте шаблон [Adapter pattern] (http://en.wikipedia.org/wiki/Adapter_pattern)) вместо того, чтобы пытаться вызвать метод, который вы не используете даже знать имя во время выполнения. – Laf

ответ

1

Да, у вас есть написать письмо:

class MyClass< T extends TheInterface > 

С этой информацией, компилятор знает, что Т есть операция по имени callMe

+0

См. Мое редактирование –

+0

Хорошо. Можете ли вы пересмотреть дизайн, чтобы сделать этот подход возможным? – Aubin

+0

Нет, я не могу, каждый раз собираюсь быть другим интерфейсом, в котором нет ничего общего. –

0

Я не уверен, что вы ищете в Strategy шаблон?

+0

Что это за шаблон? –

+0

@Babibu http://en.wikipedia.org/wiki/Strategy_pattern – Less

+0

Нет, это не то, что я ищу –

0

Если вы не можете изменить декларацию внутри MyClass, вы можете просто придумать ее.

public void callMe(T me, Object... params) { 
     Someinterface instance = (Someinterface) me; 
     list.callMe(me, params); 
    } 

Но все же объявить его, как показано ниже должно быть лучшим решением

class MyClass<T extends Someinterface > 

Ниже простая демонстрация того, как сделать это с помощью reflection

class MyClass<T> { 
    public void callMe(T me, Object... params) throws SecurityException, 
      NoSuchMethodException { 
     // How can I invoke T interface method? 
     Method size = me.getClass().getMethod("size", null); 
     Method add = me.getClass().getMethod("add", Object.class); 

     try { 
      add.invoke(me, 10); 
      System.out.println(size.invoke(me, params)); 

     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
      return; 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
      return; 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
      return; 

     } 
    } 
} 


    MyClass<List> myclass = new MyClass<List>(); 
    myclass.callMe(new ArrayList(), null); 

Выход:

1 
+0

Я не понимаю, что вы подразумеваете под его созданием.Я также не знаю этого имени этого метода, поэтому я не могу вызывать его по имени, как в вашем примере с «размером» и «добавить», –

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