В Java, как я могу создать a Type
объект для Map<String, String>
?
System.out.println(Map<String, String>.class);
не компилирует. Одно обходное решение, о котором я могу думать,
Map<String, String> dummy() { throw new Error(); }
Type mapStringString = Class.forName("ThisClass").getMethod("dummy", null).getGenericReturnType();
Действительно ли это - корректный путь?
public class Test {
public Map<String, String> dummy;
public static void main(String... args) throws SecurityException,
NoSuchFieldException {
Type mapStringString = Test.class.getField("dummy").getGenericType();
// ...
Это чуть менее уродливый хак...
Как предлагает Том Хотин, вы можете реализовать методы самостоятельно:
Type mapStrStr2 = new ParameterizedType() {
public Type getRawType() {
return Map.class;
}
public Type getOwnerType() {
return null;
}
public Type[] getActualTypeArguments() {
return new Type[] { String.class, String.class };
}
};
возвращает те же значения, что и другой подход для методов, объявленных в ParameterizedType
. Результат первого подхода даже .equals
этого типа. (Однако этот подход не переопределяет toString, equals и так далее, поэтому в зависимости от ваших потребностей первый подход может оказаться лучше)
Все это делается с помощью интерфейсов, поэтому вы можете создать свою собственную реализацию.
Однако самый простой способ - использовать отражение в фиктивном классе, созданном для этой цели.
Да, это правильный и единственный способ получить дженерики во время выполнения.Тип стирается («стирание типа»), Карта байт-кода на самом деле является картой объект-объект, определение обобщений в исходном коде используется компилятором только для обеспечения безопасности типов.