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);
有没有其他方法可以获得我想要的“类型别名”行为?也许使用一些第三方宏工具集?或者我是否需要接受我将不得不做很多类型,一种方式(在实现中使用泛型类型)还是另一种方式(为它们编写包装器)?也许有这么多通用参数飞来飞去只是一个坏主意,我需要重新思考这个问题?
[更新]好吧,我禁止任何进一步的“不要那样做”的答案。把它作为一个在我的问题域中具有真正价值的给定值(Pete Kirkham可能是对的,它有足够的值来获得具有描述性名称的正确包装器类)。但这是一个编程问题;不要试图把问题定义掉。Foo<Bar<Baz,Qux>>