#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)); } }
Комментариев нет:
Отправить комментарий