Java: экземпляр Generic - PullRequest
       11

Java: экземпляр Generic

32 голосов
/ 16 января 2011

Нет ли способа найти тип класса универсального?

if (T instanceof String) {
    // do something...
}

Выше определенно не компилируется.

Ответы [ 4 ]

45 голосов
/ 16 января 2011

Обобщения являются функцией времени компиляции.Обобщения добавляют проверки во время компиляции, которые могут не иметь никакого значения во время выполнения.Это один из примеров.Вы можете проверять только тип объекта, на который ссылаются, который может быть супертипом в коде.Если вы хотите передать тип T, вы должны сделать это явно.

void someMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

или

void someMethod(Class<T> tClass, T tArg) {

Примечание: тип может отличаться,

someMethod(Number.class, 1);
4 голосов
/ 16 января 2011

если у вас есть подкласс

public class SomeClass extends SomeSubclass<String>{}

и

public class SomeSubclass<T> {}

тогда есть способ обнаружить тип T, выполнив код

Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
    Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
    // in simple cases actualTypeArguments will contain Classes, since Class implements Type
}

если ваш случай немного сложнее (? extends String) `взгляните на org.ormunit.entity.AEntityAccessor # extractClass

3 голосов
/ 16 января 2011

Он не скомпилируется, потому что T - это не переменная, а заполнитель для класса, определенного во время выполнения.Вот быстрый пример:

public class Test<T> {

public void something(T arg) {
    if (arg instanceof String) {
        System.out.println("Woot!");
    }
}

public static void main(String[] args) {
    Test<String> t = new Test<String>();
    t.something("Hello");
}

}
1 голос
/ 07 ноября 2017

Если у вас есть определенное поле, вы можете просто проверить его, как показано ниже:

private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...
...