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

У меня есть 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(); } 
  • Поиск значения enums по его описанию Атрибут
  • Получить свойства classа с помощью Typcript
  • Быстрое создание объектов вместо Activator.CreateInstance (type)
  • Получение типа classа из строки
  • Могу ли я использовать reflection для проверки кода в методе?
  • Загрузка DLL-файлов во время выполнения в C #
  • C # reflection - загрузить сборку и вызвать метод, если он существует
  • Я хочу получить тип переменной во время выполнения
  • Как вызвать частный статический метод с использованием отражения (Java)?
  • C # Получение значения парм с использованием отражения
  • Каков риск безопасности отражения объекта?
  • Давайте будем гением компьютера.