2016-09-18 3 views
-2

У меня есть метод типа-параметризованных, но я не могу назвать getClass по параметру типа-параметризованных, поскольку он может быть null, так что единственное решение, которое я вижу, чтобы получить Class от самого параметра типа, как-то:Как получить объект класса из параметра типа метода?

public <T> Class myMethod(T obj) 
{ 
    //can't do this: return obj.getClass() because null is permitted. 
} 

Этот метод просто иллюстрирует проблему. Мой фактический метод даже не возвращает класс параметра, но использует его по-другому. Ядро проблемы заключается в следующем: существует ли способ получить объект Class, который представляет параметризованный тип параметра моего метода, без использования obj.getClass() (поскольку в случае, если obj равен null, мне все еще нужно знать, с каким параметром типа был метод вызывается, например: <String>myMethod(null) должен возвращать объект класса java.lang.String).

EDIT Это не дубликат указанного вопроса, потому что мой класс не параметризирован, а только мой метод.

+1

Вы не можете, период. Что это значит сказать вам, что 'getClass()' не будет? – chrylis

+0

@chrylis Метод является иллюстрацией. Мой фактический метод не такой. Я просто сводил проблему к своей сути: мне нужно знать класс объекта, который может быть нулевым. – FinnTheHuman

+0

Возможный дубликат [Как получить экземпляр класса дженериков типа T] (http://stackoverflow.com/questions/3437897/how-to-get-a-class-instance-of-generics-type-t) – fabian

ответ

2

Ядро проблемы заключается в следующем: Есть ли способ, чтобы получить Class объект, который представляет параметризованный тип параметра моего метода [...]

No. Class не содержит информацию о значениях параметров типа. Class содержит только данные об определения, но не об использовании какого-либо типа. Фактически вы не можете получить такую ​​информацию о параметре типа из-за стирания типа (см. https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html (методы) и https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html (типы)).

+0

Я вижу сейчас. Компилятор вообще не сохраняет никакой информации. Спасибо, это отвечает на мой вопрос – FinnTheHuman

0

Решение реорганизовать метод:

public <T> Class<T> myMethod(Class<T> theClass, T obj) 
    // other stuffs 
    return theClass; 
} 

но абонент уже знает, что Т, поэтому реальный вопрос, зачем вам это нужно.

=> сообщество wiki

+0

Это подход, который я пытался избежать. Я реорганизую свой метод на класс Class myMethod (класс cls, Object obj) ' – FinnTheHuman

+0

Параметр' obj' бесполезен здесь, поскольку он никогда не используется. Метод в целом также довольно бесполезен, поскольку он просто возвращает один из своих аргументов, поэтому почему бы просто не использовать переданный аргумент напрямую вместо вызова метода? – newacct

+0

@newacct "другие товары" –

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