Создание объекта типа параметра

У меня есть class шаблонов следующим образом:

class MyClass { T field; public void myMethod() { field = new T(); // gives compiler error } } 

Как создать новый экземпляр T в моем classе?

После стирания стилей все, что известно о T заключается в том, что это некоторый подclass Object . Вам нужно указать какую-либо фабрику для создания экземпляров T

Один из подходов может использовать Supplier :

 class MyClass { private final Supplier ctor; private T field; MyClass(Supplier ctor) { this.ctor = Objects.requireNonNull(ctor); } public void myMethod() { field = ctor.get(); } } 

Использование может выглядеть так:

 MyClass it = new MyClass<>(StringBuilder::new); 

Кроме того, вы можете предоставить объект Class , а затем использовать reflection.

 class MyClass { private final Constructor ctor; private T field; MyClass(Class impl) throws NoSuchMethodException { this.ctor = impl.getConstructor(); } public void myMethod() throws Exception { field = ctor.newInstance(); } } 

Другим неотражающим подходом является использование гибридного шаблона Builder / Abstract Factory.

В Эффективной Java Джошуа Блох подробно описывает шаблон Builder и выступает за общий интерфейс Builder:

 public interface Builder { public T build(); } 

Бетонные строители могут реализовать этот интерфейс, а внешние classы могут использовать конкретный строитель для настройки Builder по мере необходимости. Строитель может быть передан MyClass в качестве Builder .

Используя этот шаблон, вы можете получить новые экземпляры T , даже если T имеет параметры конструктора или требует дополнительной настройки. Конечно, вам нужно каким-то образом передать Builder в MyClass. Если вы не можете передать что-либо в MyClass, то Builder и абстрактная фабрика отсутствуют.

Это может быть более тяжеловесным, чем то, что вы ищете, но оно также будет работать. Обратите внимание, что если вы примете этот подход, было бы разумнее ввести фабрику в MyClass, когда она будет построена, а не передавать ее в ваш метод каждый раз, когда он вызывается.

 interface MyFactory { T newObject(); } class MyClass { T field; public void myMethod(MyFactory factory) { field = factory.newObject() } } 

Если вы готовы к подclassу, вы также можете избежать стирания, посмотрите http://www.artima.com/weblogs/viewpost.jsp?thread=208860

Класс classOfT

  try { t = classOfT.newInstance();//new T(); NOTE: type parameter T cannot be instantiated directly } catch (Exception e) { e.printStackTrace(); } 
  • Я хочу получить тип переменной во время выполнения
  • Какая польза для тегов в Go?
  • ClassCastException при литье в один class
  • Как ограничить setAccessible только «законным» использованием?
  • Как получить имя и тип вызывающего метода с помощью отражения?
  • Как получить MethodInfo метода интерфейса, внедряя MethodInfo метода classа?
  • Получение типа classа из строки
  • Как я могу динамически добавлять поле в class в C #
  • Как вы можете перебирать свойства classа?
  • Как проверить, является ли тип примитивным
  • Получить общий метод без использования GetMethods
  • Давайте будем гением компьютера.