2016-11-19 2 views
1

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

Пример: если функция

public <T extends Base> void convert(final T arg) {} 
public <T> void method2(Class<T> typeParamClass) {} 

Как передать аргумент в Class<T> методу 2?

сообщение

Ошибка при попытке передать arg.getClass()

Real фрагмента кода

static <T> byte[] method2(T object, final Class<T> typeParameterClass) throws SerializationException { 
} 


static <T> T method3(final byte[] serializedObject, final Class<T> typeParameterClass) throws SerializationException { 
     return (T) serializer.deserialize(typeParameterClass, Buffers.toBuffer(serializedObject)); 
    } 
} 

public static <T> T clone(final T object) { 
    return method3(method2(object, object.getClass()), object.getClass()); 
} 

enter image description here

+0

Просьба пояснить, ** какой ** * другой * метод? –

+0

@ user3089214: Пожалуйста, предоставьте [mcve]. –

+2

Почему 'method2' даже объявляет параметр типа? Здесь это кажется бессмысленным. –

ответ

3
public <T> void method2(Class<T> typeParamClass) 

Если вы сделаете второй метод универсальным, вы сможете чтобы использовать это как

public <T extends Base> void convert(final T arg) { 
    method2(arg.getClass()); 
} 

Для T нет ограничений на method2 (T extends Object), поэтому вы можете свободно передавать любые T (включая T extends Base).

Как отметил Sotirios Delimanolis, T действительно бессмысленно здесь и метод можно определить просто:

public void method2(Class<?> typeParamClass) 

UPDATE:

method2(object, object.getClass()) 
         ^^^ 

Основной проблемой здесь является то, что getClass() является виртуальным метод возвращает тип времени выполнения экземпляра. Он не может гарантировать возврат Class<T> от данного T, но ? extends T он может. Для его компиляции вы должны изменить подпись на:

method2(T object, final Class<? extends T> typeParameterClass) 
           ^^^ 
+0

Я обновил свой вопрос с правильной подписью метода2. Я не могу изменить подпись метода method2 (arg.getClass()); не работает – user3089214

+1

@ user3089214: Как он не работает? Кажется, что он работает в этом тестовом случае: http://ideone.com/itdAIU –

+0

Ошибка Gettinr (java.lang.Class ) не может быть применена к (java.lang.Class >) – user3089214

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