Как увидеть, если класс на самом деле класс <T>? - PullRequest
1 голос
/ 24 января 2020

У меня есть метод generi c, который должен искать класс определенного типа c. Мне удается получить этот класс как Class<?>, теперь я хочу проверить, действительно ли он имеет запрошенный тип, и если да, вернуть его (иначе ноль). Единственный код, который, похоже, сработал, - это просто попробовать приведение и сгенерировать исключение, если оно не удалось. Однако меня беспокоит производительность этого кода, поскольку он будет использоваться очень часто, и я слышал, что генерирование исключений не очень производительно.

public static <T> Class<T> getThatClass() {
    Class<?> clazz = // some internal lookup
    try {
        return (Class<T>) clazz;
    } catch (ClassCastException e) {
        return null;
    }
}

Есть ли способ проверить, имеет ли значение clazz типа E без исключений? Я хотел бы что-то вроде этого, но, к сожалению, это не компилируется:

public static <T> Class<T> getThatClass2() {
    Class<?> clazz = // some internal lookup
    if (clazz instanceof Class<T>) {
        return (Class<T>) clazz;
    } else {
        return null;
    }
}

Ответы [ 2 ]

1 голос
/ 24 января 2020

Class.isAssignableFrom(..) - неэкземплярный вариант для проверки типа. Использование:

Assert.assertTrue(Number.class.isAssignableFrom(Integer.class));
Assert.assertTrue(Number.class.isAssignableFrom(Double.class));
Assert.assertFalse(Number.class.isAssignableFrom(String.class));

Collection<Integer> c = Arrays.asList(1, 2, 3);
Assert.assertTrue(List.class.isAssignableFrom(c.getClass()));
Assert.assertFalse(Set.class.isAssignableFrom(c.getClass()));

Также содержит полезные методы для проверки экземпляров и приведения:

Assert.assertTrue(List.class.isInstance(c));
List<Integer> list = List.class.cast(c);
0 голосов
/ 24 января 2020

Java Общих не существует во время выполнения. Generics - это функция безопасности во время компиляции. То, что вы могли бы сделать, это что-то вроде

public static Class<?> getThatClass2(String nameToMatch) {
  Class<?> clazz = // some internal lookup
  if (clazz.getName().equals(nameToMatch) {
    return clazz;
  } else {
    return null;
  }
}

Я не копировал / вставлял это откуда-то еще на SO. Если бы я нашел дубликат, я бы проголосовал закрытым - дубликат

...