2013-10-20 4 views
1

У меня вопрос, что я не могу найти ответ нигде. У меня есть два метода, которые почти идентичны. Разница между этими двумя методами заключается в том, что они являются разными объектами.Может ли java generics делать то, что мне нужно?

public static **Object[]** readFile(**Object[]** inObj){ 
    for(int i = 0; i < inObj.length ; i++){ 
     inObj[i] = new **Object()**; 
     String str = objectInput.nextLine(); 
     inObj[i].**setObjectLine**(str); 
    } 
    return inObj; 
} 

Выше приведен пример метода, некоторые из которых были удалены. Полужирный (заключенный в ** текст) - это те части, которые отличаются друг от друга. , поэтому у меня есть два метода, точно так же, как это возможно для меня использовать дженерики, чтобы устранить необходимость в двух разных методах?

+0

Разделяют ли они общий базовый интерфейс с помощью метода, который необходимо вызвать? – SLaks

ответ

2

Предполагая, что у вас есть контроль над объектными классами, это возможно: у Java есть конкретная идиома для поддержки создания экземпляра, и вы должны иметь возможность добавить общий интерфейс для поддержки вызова setObjectLine.

interface WithSetLine { 
    void setObjectLine(String str); 
} 
public static <T extends WithSetLine> T[] readFile(T[] inObj, Class<T> cl) 
    throws Exception 
{ 
    for(int i = 0; i < inObj.length ; i++) { 
     inObj[i] = cl.newInstance(); 
     String str = objectInput.nextLine(); 
     inObj[i].setObjectLine(str); 
    } 
    return inObj; 
} 
+0

OP также может рассмотреть возможность использования [фабрики] (http://en.wikipedia.org/wiki/Factory_method_pattern) вместо использования рефлексии. – Jeffrey

+0

спасибо за ответ, я думаю, что это все немного выше моего уровня мастерства. Есть ли способ определить тип метода во время выполнения? – user2899185

+0

@ user2899185 Насколько я знаю, нет простого способа определить возвращаемый тип запущенного метода или его параметры времени выполнения. Вы можете сделать некоторые взломы, чтобы сделать это, но это требует гораздо более высокого уровня квалификации, чем предлагаемое мной решение. Если вы будете следовать вводному руководству Oracle по дженерикам, вы должны понимать каждую отдельную строку в приведенном выше решении. – dasblinkenlight

0

Дженерики применяются к классам и методам в рамках этих классов; это, во всяком случае, путается говорить о дженериках, поскольку они относятся только к методам.

Если у вас есть класс, который имеет полезные методы, которые применяются к другим классам, то вы можете использовать generics для определения этого класса и создания экземпляров объектов этого класса для работы с разными типами параметров. Например, вы можете думать о ArrayList, чтобы вы могли иметь ArrayList и ArrayList. Тогда различные методы в списке, которые требуют класса, используемого для создания экземпляра списка массивов, относятся к этому классу pass-in.

Надеюсь, это поможет.

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