Возможно ли отражать типичный тип в Java? Используя описанную технику здесь Я получаю сообщение об ошибке, потому что токены классов не могут быть общими. Возьмите пример ниже. Я хочу создать экземпляр некоторого подкласса Творца, который реализует Творца. Фактическое имя класса передается как аргумент командной строки. Идея состоит в том, чтобы иметь возможность указать реализацию Creator во время выполнения. Есть ли другой способ выполнить то, что я пытаюсь сделать здесь?
public interface Creator<T> {
T create();
}
public class StringCreator implements Creator<String> {
public String create() { return new String(); }
}
public class FancyStringCreator implements Creator<String> {
public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
Class<?> someClass = Class.forName(args[0]);
/*ERROR*/Class<? extends Creator<String>> creatorClass = someClass.asSubclass(Creator.class);
Constructor<? extends Creator<String>> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}
Изменить: мне нравится подход Маркуса как самый простой и прагматичный, не обойдя все дженерики. Я могу использовать его в своей ситуации, потому что могу указать, что переданный класс должен быть подклассом StringCreator. Но по мере того как Эриксон указывал, что общая информация все еще присутствует на уровне типа, просто не на уровне времени выполнения, так что все еще можно рефлексивно исследовать, реализует ли данный класс правильный общий тип.