Страницы

Поиск по вопросам

пятница, 28 февраля 2020 г.

Как создать объект типа T

#java #generics


У меня есть метод с параметром

 void testMethod(Consumer arg) {
  T t = ???;
  arg.accept(t);
}


Как создать объект типа T при условии что T имеет конструктор по умолчанию?

Вот код, который я испытывал

public class MethodConsumer {
  private  void test(T t) {  // Consumer
    System.out.println("test()"+t);
  };

   void testMethod(Consumer arg) {
    T t = null;
    arg.accept(t);
  }

  public static void main(String[] args){
    MethodConsumer test = new MethodConsumer();
    test.testMethod((t) -> test.test(t));
  }

}

    


Ответы

Ответ 1



Вообще то, то что вы пытаетесь сделать запрещено, читайте туториал You cannot create an instance of a type parameter. Оно и понятно, шаблон не живет сам по себе, он живет только с конкретным типом. В вашем случае рабочий код может выглядеть приблизительно так: void testMethod(Consumer arg, Class clazz) { T t = clazz.newInstance(); //надо ловить эксепшн arg.accept(t); } Обратите внимание, что во втором параметре мы указываем тип T А вызов его типа, так: String s="blabla"; test.testMethod(arg, s.class);

Ответ 2



void testMethod(Consumer arg) { T t = ???; arg.accept(t); } В этом случае попытка создать новый экземпляр класса противоречит самой идее шаблонов. Шаблоны нужны для того, чтобы отвязать алгоритм работы с данными от конкретной реализации данных. Например LinkdList'у без разницы что у него внутри, алгоритм для всех типов данных один и тот же. Шаблон работает с любым типом данных, но нельзя создать объект любого типа, потому что непонятно что создавать. Если вам нужно работать с каким-то конкретным типом данных, то его и используйте. public class MethodConsumer { class MyClass{ } private void test(T t) { // Consumer System.out.println("test()"+t); }; void testMethod(Consumer arg) { MyClass t = new MyClass(); arg.accept(t); } public static void main(String[] args){ MethodConsumer test = new MethodConsumer(); test.testMethod((t) -> test.test(t)); } }

Комментариев нет:

Отправить комментарий