Нет ли способа найти класс-тип общего?
if (T instanceof String) {
// do something...
}
Вышеуказанное не компилируется.
Нет ли способа найти класс-тип общего?
if (T instanceof String) {
// do something...
}
Вышеуказанное не компилируется.
Generics - это функция времени компиляции. Generics добавляет проверки во время компиляции, которые могут не иметь никакого значения во время выполнения. Это один из примеров. Вы можете проверить только тип объекта, который может быть супер-типом в коде. Если вы хотите передать тип T, вы сделаете это явно.
void someMethod(Class<T> tClass) {
if(String.class.isAssignableFrom(tClass))
или
void someMethod(Class<T> tClass, T tArg) {
Примечание: тип может быть не таким,
someMethod(Number.class, 1);
если у вас есть подкласс
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
Он не будет компилироваться, потому что 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");
}
}
Если у вас есть определенное поле, вы можете просто проверить его, как показано ниже:
private <T> String someMethod(T genericElement)
{
if (String.class.isInstance(genericElement))
{
return (String) genericElement;
}
...