Как объяснялось в других ответах, чтобы использовать этот подход ParameterizedType
, вам нужно расширить класс, но это похоже на дополнительную работу, чтобы сделать весь новый класс, который расширяет его ...
So , что делает класс абстрактным, он заставляет вас расширять его, тем самым удовлетворяя требование подкласса. (используя lombok's @Getter).
@Getter
public abstract class ConfigurationDefinition<T> {
private Class<T> type;
...
public ConfigurationDefinition(...) {
this.type = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
...
}
}
Теперь, чтобы расширить его, не определяя новый класс. (Обратите внимание, что {} на конце ... расширен, но ничего не перезаписывайте - если вы не хотите).
private ConfigurationDefinition<String> myConfigA = new ConfigurationDefinition<String>(...){};
private ConfigurationDefinition<File> myConfigB = new ConfigurationDefinition<File>(...){};
...
Class stringType = myConfigA.getType();
Class fileType = myConfigB.getType();