2016-09-23 2 views
7

я встречаю проблемы при помощи шаблонного методаКак передать общий объект как общий параметр для другого метода в java?

Составитель класс:

public class Something<T> { 
    public static Something newInstance(Class<T> type){}; 
    public <T> void doSomething(T input){}; 
} 

и мой метод:

public <S> void doOtherThing(S input){ 
     Something smt = Something.newInstance(input.getClass()); 
     smt.doSomething(input); // Error here 
} 

Он получил ошибку во время компиляции:

нет подходящий метод для doSomething (T) T не может быть преобразован в захват # 1 o f? расширяет java.lang.Object ...

Я думаю, что может быть уловкой, чтобы избежать этого, пожалуйста, помогите

+1

Ваш код не компилируется. Пожалуйста, укажите правильные источники – bedrin

+0

Здесь много проблем. Сначала есть два отдельных 'T'. 'doSomething'' T 'не совпадает с классом 'Something'' T ', потому что' doSomething' является универсальным методом, который объявляет свой собственный 'T'. Вы должны назвать две переменные по-разному, потому что они не связаны друг с другом. Тогда тот факт, что 'doSomething' использует только' T' только как тип параметра, а 'T' неограничен, означает, что он принимает что-либо, поэтому он эквивалентен' public void doSomething (Object input) {} '; 'T' бесполезен. То же самое с 'doOtherThing' - это эквивалентно' public void doOtherThing (ввод объекта) ' – newacct

ответ

2

Я думаю input.getClass() должен быть приведен к Class<T>

public <S> void doOtherThing(S input){ 
     Something smt = Something.newInstance((Class<T>)input.getClass()); 
     smt.doSomething(input); 
} 
+2

Это небезопасно из-за необработанного типа и неконтролируемого кастинга. – Bastien

0

Что-нибудь подобное? (Общий тип декларации штуковина на нашем методе newInstance)

public class Something<T> { 
    public static <T> Something<T> newInstance(Class<T> type){ return null; } 
    public <T> void doSomething(T input){}; 
} 
+0

Нет, он отлично работает с не общей переменной (например, String) – lethanh

4

Pass класс S в качестве аргумента.

public class Something<T> 
{ 
    public static <T> Something<T> newInstance(Class<T> type) 
    { 
     return new Something<T>(); 
    } 

    public void doSomething(T input){;} 

    public <S> void doOtherThing(Class<S> clazz, S input) 
    { 
     Something<S> smt = Something.newInstance(clazz); 
     smt.doSomething(input); 
    } 
} 
+0

У этого есть 2 аргумента :(но это сработало – lethanh

+0

Так ли это имеет значение? Назовите его с doOtherThing (sObject.class, sObject); – Bastien

+0

Но действительно doOtherThing довольно бесполезен, если не статичен. В основном это просто создание экземпляра Something и применение doSomething , с общим типом S вместо T. – Bastien

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