Java: Как проверить общие определения типов классов? - PullRequest
5 голосов
/ 20 января 2009

Идея состоит в том, чтобы определить базовый класс, который может вызывать методы, определенные в наследуемых классах, но во время создания я хочу убедиться, что такие методы определены точно в соответствии с требованиями, а именно то, что методы принимают только один аргумент, HashMap <String String>.

До сих пор я смог с помощью следующего кода проверить, что метод содержит только один параметр и что он принадлежит к классу HashMap, но как я могу проверить, что общее определение равно <String, String>?

public boolean isMethodParameterValid(final Method method) {
  final Class<?>[] parameters = method.getParameterTypes();
  return ((parameters.length == 1) && parameters[0].isAssignableFrom(HashMap.class));
}

Ответы [ 4 ]

12 голосов
/ 04 июня 2009

Действительно, есть стирание типа, но оно не применяется к переменным / полям - только к определениям классов, где параметры типа стираются и заменяются их верхними границами.

Это означает, что то, что вы просите, может быть достигнуто. Вот как вы можете проверить общие параметры первого параметра метода:

class Z
{
  public void f(List<String> lst) { }
}

...

Method m = Z.class.getMethod("f", List.class);
Type t = m.getGenericParameterTypes()[0];
if(t instanceof ParameterizedType) {
  ParameterizedType pt = (ParameterizedType) t;
  System.out.println("Generic params of first argument: " + Arrays.toString(pt.getActualTypeArguments()));
}    
7 голосов
/ 20 января 2009

Вы не можете. Универсальные типы Java «стираются» компилятором, то есть HashMap<String, String> становится просто HashMap во время выполнения. См. этот вопрос.

1 голос
/ 04 июня 2009

Как уже было отмечено, во время выполнения вы не можете просматривать общую часть типа.

Есть ли причина, по которой вы можете просто определить абстрактный метод, как в шаблоне шаблона?

Тогда проверка будет выполняться статически.

protected abstract void process(HashMap<String, String>);

(также есть причина требовать, чтобы HashMap использовался только для Map?)

1 голос
/ 20 января 2009

Я действительно не понимаю цели того, что вы пытаетесь сделать. У меня есть ощущение, что это можно проверить во время компиляции, тщательно продумав иерархию классов. Но без более подробной информации о проблеме, которую вы пытаетесь решить, я не могу вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...