У меня довольно сложный набор общих классов в Java. Например, у меня есть интерфейсТипичные псевдонимы для генераторов Java
interface Doable<X,Y> {
X doIt(Y y);
}
и реализацию
class DoableImpl implements Doable<Foo<Bar<Baz,Qux>>,Foo<Bar<Zot,Qux>>> {
Foo<Bar<Baz,Qux>> doIt(Foo<Bar<Zot,Qux>> fooBZQ) { ... }
}
В реальной реализации Doable
имеет довольно много методов и так Foo<Bar<Baz,Qux>>
и т.д., появляются снова и снова. (Верьте или нет, общие типы немного более болезненны, чем это. Я упростил их для примера.)
Я хотел бы упростить их, чтобы сохранить себя печатать и облегчить деформацию на моих глазах. Я хотел бы иметь простой «псевдоним типа» для Foo<Bar<Baz,Qux>>
и т. Д., Например FooBBQ
и FooBZQ
.
Моя текущая идея состоит в том, чтобы определить классы-оболочки:
class FooBBQ {
public static FooBBQ valueOf(Foo<Bar<Baz,Qux>> fooBBQ) {
return new FooBBQ(fooBBQ);
}
private Foo<Bar<Baz,Qux>> fooBBQ;
private FooBBQ(Foo<Bar<Baz,Qux>> fooBBQ) {
this.fooBBQ = fooBBQ;
}
public Foo<Bar<Baz,Qux>> toGeneric() {
return fooBBQ;
}
}
class FooBZQ { /* pretty much the same... */ }
class DoableImpl implements Doable<FooBBQ,FooBZQ> {
FooBBQ doIt(FooBZQ fooBZQ) { ... }
}
Это хорошо работает, но у него есть несколько недостатков:
- Нам необходимо определить отдельные обертки для каждого родового экземпляра. Классы-оболочки являются короткими и стилизованными, но я не могу определить способ их макроопределения.
У нас есть служебные данные по переводу (концептуально, если не оперативно) для вызова
valueOf
иtoGeneric
для преобразования междуFooBBQ
иFoo<Bar<Baz,Qux>>
. Например, еслиdoIt
вызовы в некоторой библиотеке рутиной, ожидающейFoo<Bar<Zot,Qux>>
(который делает реальное осуществление), мы в конечном итоге с чем-то вродеreturn FooBBQ.valueOf(libraryCall(fooBZQ.toGeneric()))
, где мы бы имели первоначально
return libraryCall(fooBZQ);
Есть ли другой способ получить поведение типа «псевдоним», которое я хочу здесь? Возможно, используя некоторые сторонние инструменты для макросов? Или мне нужно принять, что мне придется много набирать, одним способом (используя общие типы в реализации) или другим (писать обертки для них)? Может быть, если это много общих параметров, которые летают, это всего лишь плохая идея, и мне нужно переосмыслить проблему?
[UPDATE] ОК, я запрещаю дальнейшие ответы «не делай этого». Возьмите его как данность, что Foo<Bar<Baz,Qux>>
имеет истинное значение в моей проблемной области (Пит Киркхам может быть прав, что у него есть достаточно значение, чтобы получить правильный класс-оболочку с описательным именем). Но это проблема программирования; не пытайтесь определить проблему.
Я собираюсь сказать «возможно, да» до последнего, но на самом деле нет конструктивной обратной связи: P Похоже на беспорядок! Удачи! –
Я думаю, что этот вопрос будет хорошим предложением для Java. Если вы могли бы предложить функцию «Тип слияния» для Oracle, я думаю, что это будет отличная языковая функция, которая упростит язык и сделает исходный код более удобочитаемым. –
Колено глубоко в Java сегодня и захотелось очистить некоторый подробный код ... не только я не получаю вывод типа, но и не накладываю тип. * sob * –