Обобщения стираются после компиляции.
Таким образом, даже этот действительный код не поможет вам в дальнейшем:
HashMap<Long, HashMap<String, Semaphore>> map = new HashMap<>();
Class<?> clazz = map.getClass();
clazz
будет означать java.util.HashMap
«только», а не его обобщения.
О вашем требовании, если случится так, что вам придется написать такой код и, кроме того, проверив типы обобщенных типов:
if (clazz.isInstance(myVariable)) {
// do something
}
Я думаю, это должно переосмыслить вашу логику.
Дженерики в основном предназначены для повышения безопасности типов, что механически снижает требования до instanceof
испытаний и спусков.
Если это не разрешено в Java, есть ли другой способ проверить, является ли переменная экземпляром типа, определенного как шаблон?
Вы можете сохранитьтипы, указанные в универсальном экземпляре путем добавления полей class
в универсальный класс.Но поскольку вы используете встроенный тип, вы застряли.
С вашим собственным классом вы можете получить информацию таким образом, например:
public class Foo<T, U, V> {
private Map<T, HashMap<U, V>> map = new HashMap<>();
private Class<T> tClass;
private Class<U> uClass;
private Class<V> vClass;
public Foo(Class<T> t, Class<U> u, Class<V> v) {
this.tClass = t;
this.uClass = u;
this.vClass = v;
}
}
Таким образом, вы можете использовать tClass
, uClass
, vClass
для выполнения необходимых проверок.
Но, как уже было сказано, идти по этому пути, вероятно, не лучшая вещь.