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

181
19 октября 2018, 20:10

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

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

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

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

public class MethodConsumer {
  private <T> void test(T t) {  // Consumer<T>
    System.out.println("test()"+t);
  };
  <T> void testMethod(Consumer<T> arg) {
    T t = null;
    arg.accept(t);
  }
  public static void main(String[] args){
    MethodConsumer test = new MethodConsumer();
    test.testMethod((t) -> test.test(t));
  }
}
Answer 1

Вообще то, то что вы пытаетесь сделать запрещено, читайте туториал

You cannot create an instance of a type parameter.

Оно и понятно, шаблон не живет сам по себе, он живет только с конкретным типом.

В вашем случае рабочий код может выглядеть приблизительно так:

 <T> void testMethod(Consumer<T> arg, Class<T> clazz) {
    T t = clazz.newInstance(); //надо ловить эксепшн
    arg.accept(t);
  }

Обратите внимание, что во втором параметре мы указываем тип T

А вызов его типа, так:

String s="blabla";
test.testMethod(arg, s.class);
Answer 2
   <T> void testMethod(Consumer<T> arg) {
      T t = ???;
      arg.accept(t);
    }

В этом случае попытка создать новый экземпляр класса противоречит самой идее шаблонов.

Шаблоны нужны для того, чтобы отвязать алгоритм работы с данными от конкретной реализации данных. Например LinkdList'у без разницы что у него внутри, алгоритм для всех типов данных один и тот же. Шаблон работает с любым типом данных, но нельзя создать объект любого типа, потому что непонятно что создавать.

Если вам нужно работать с каким-то конкретным типом данных, то его и используйте.

public class MethodConsumer {
  class MyClass{
  }
  private <T> void test(T t) {  // Consumer<T>
    System.out.println("test()"+t);
  };
  void testMethod(Consumer<MyClass> arg) {
    MyClass t = new MyClass();
    arg.accept(t);
  }
  public static void main(String[] args){
    MethodConsumer test = new MethodConsumer();
    test.testMethod((t) -> test.test(t));
  }
}
READ ALSO
Java. События кнопки

Java. События кнопки

Учу события кнопки и не могу решить задачу, тк не понимаю с областями видимости и со смыслом

195
Следить за Log-ами приложения

Следить за Log-ами приложения

UPDATED Как правильно записывать логи в файл в приложении, что проверяют тестировщики?

216
Как установить пометку checked в form:radiobuttons?

Как установить пометку checked в form:radiobuttons?

при генерации формы на jsp странице использую тег form:radiobuttons, в который передаю список с параметрами

220
Чтение и запись данных sd карты в Android

Чтение и запись данных sd карты в Android

Необходимо читать и писать данные в память sd карты (желательно иметь возможность указать адрес или смещение записи)SD карта без файловой системы

176