Необходимо найти параметр лямбда-функции метода возвращаемого типа. ⇐ JAVA
-
Гость
Необходимо найти параметр лямбда-функции метода возвращаемого типа.
(Примечание. Я изменил структуру примера, чтобы он более точно соответствовал варианту использования, над которым я работаю)
У меня определен следующий интерфейс:
Перехватчик общедоступного интерфейса { T перехват (вызов вызова); Вызов интерфейса { Т продолжить(); } } Простейшая реализация этого будет выглядеть примерно так:
класс TestInterceptor { статический класс Line {int x1, y1, z1, x2, y2, z2;} статический класс Color {int r, g, b;} статический класс рендерера { Перехватчик-перехватчик; Рендерер (перехватчик-перехватчик) {this.interceptor = перехватчик;} void draw (Supplier lineSource, Поставщик colorSource) { Строка thisLine = interceptor.intercept(lineSource::get); Color thisColor = interceptor.intercept(colorSource::get); // делаем рисунок } } недействительный drawSomething () { Renderer render = новый Renderer(getInterceptor()); render.draw( () -> createLine(), () -> createColor() ); } Line createLine () {return new Line(/*something*/);} Color createColor () {return new Color(/*something*/);} Перехватчик getInterceptor () { вернуть новый перехватчик() { T перехват (вызов ) { /* хотелось бы сделать это: если (invoction.returnType = Line) { вернуть новую MyLINE(); } еще { вернуть вызов.proceed(); } */ вернуть вызов.proceed(); } } } } Обратите внимание на комментарий в getInterceptor() о том, что я хотел бы предпринять разные действия (в том числе не вызывать лямбду) в зависимости от того, что лямбда собирается вернуть. Я испробовал все, что мог, чтобы получить фактический тип, стоящий за параметризованным типом T, но продолжал рисовать пробел. Может ли кто-нибудь мне помочь?
Вот что я пробовал
Класс wclass = interceptor.getClass(); Метод метод = wclass.getMethod("продолжить", новый класс[]{}); Класс rtype = метод.getReturnType(); //getName() всегда возвращает «java.lang.Object» Введите gtype = метод.getGenericReturnType(); Класс gtclass = gtype.getClass(); //getName() всегда возвращает «java.lang.Class» Строка gtname = gtype.getTypeName()); //всегда возвращает "java.lang.Object" На самом деле я пытаюсь создать «Удаленный запуск» для JUnit5, чтобы я мог использовать Maven SureFire для запуска тестов в отдельно запущенном и настроенном «контейнере» OSGi (это перегруженный термин, но не заставляйте меня начинать). За исключением метода getInterceptor(), весь приведенный выше пример кода представляет собой упрощение существующего кода Junit5, и я не могу ничего изменить.
(В идеале я бы интегрировал новую программу удаленного запуска в PaxExam, которая, похоже, находится в застое.)
(Примечание. Я изменил структуру примера, чтобы он более точно соответствовал варианту использования, над которым я работаю)
У меня определен следующий интерфейс:
Перехватчик общедоступного интерфейса { T перехват (вызов вызова); Вызов интерфейса { Т продолжить(); } } Простейшая реализация этого будет выглядеть примерно так:
класс TestInterceptor { статический класс Line {int x1, y1, z1, x2, y2, z2;} статический класс Color {int r, g, b;} статический класс рендерера { Перехватчик-перехватчик; Рендерер (перехватчик-перехватчик) {this.interceptor = перехватчик;} void draw (Supplier lineSource, Поставщик colorSource) { Строка thisLine = interceptor.intercept(lineSource::get); Color thisColor = interceptor.intercept(colorSource::get); // делаем рисунок } } недействительный drawSomething () { Renderer render = новый Renderer(getInterceptor()); render.draw( () -> createLine(), () -> createColor() ); } Line createLine () {return new Line(/*something*/);} Color createColor () {return new Color(/*something*/);} Перехватчик getInterceptor () { вернуть новый перехватчик() { T перехват (вызов ) { /* хотелось бы сделать это: если (invoction.returnType = Line) { вернуть новую MyLINE(); } еще { вернуть вызов.proceed(); } */ вернуть вызов.proceed(); } } } } Обратите внимание на комментарий в getInterceptor() о том, что я хотел бы предпринять разные действия (в том числе не вызывать лямбду) в зависимости от того, что лямбда собирается вернуть. Я испробовал все, что мог, чтобы получить фактический тип, стоящий за параметризованным типом T, но продолжал рисовать пробел. Может ли кто-нибудь мне помочь?
Вот что я пробовал
Класс wclass = interceptor.getClass(); Метод метод = wclass.getMethod("продолжить", новый класс[]{}); Класс rtype = метод.getReturnType(); //getName() всегда возвращает «java.lang.Object» Введите gtype = метод.getGenericReturnType(); Класс gtclass = gtype.getClass(); //getName() всегда возвращает «java.lang.Class» Строка gtname = gtype.getTypeName()); //всегда возвращает "java.lang.Object" На самом деле я пытаюсь создать «Удаленный запуск» для JUnit5, чтобы я мог использовать Maven SureFire для запуска тестов в отдельно запущенном и настроенном «контейнере» OSGi (это перегруженный термин, но не заставляйте меня начинать). За исключением метода getInterceptor(), весь приведенный выше пример кода представляет собой упрощение существующего кода Junit5, и я не могу ничего изменить.
(В идеале я бы интегрировал новую программу удаленного запуска в PaxExam, которая, похоже, находится в застое.)
Мобильная версия