【发布时间】:2015-04-21 19:21:19
【问题描述】:
我想知道当包含类型层次结构和许多泛型变量时,是否可以使 java 的泛型更具可读性和/或更易于使用。我还不太熟悉java的泛型。下面的例子可以做什么:
假设我需要以下课程...
abstract class BaseClass<T> {}
...使用以下类的列表...
class Foo<T1, T2> {}
... 并在此类实例上额外提供一个迭代器。
所以我会做以下事情:
class ImplClass<T1, T2> extends BaseClass<List<Foo<T1, T2>>> implements Iterator<Foo<T1, T2>> {}
我们还假设有一个处理 BaseClass 的接口:
interface Manipulator<T, B extends BaseClass<T>> {
void doSomething(B baseClassInstance);
}
因此,当为 ImplClass 编写实现该接口的类时,我总是不得不再次编写整个泛型签名,不是吗? 所以像:
class ManipulatorA<T1, T2> implements Manipulator<List<Foo<T1, T2>>, ImplClass<T1, T2>> {
@Override
void doSomething(ImplClass<T1, T2> baseClassInstance) {...}
}
class ManipulatorB<T1, T2> implements Manipulator<List<Foo<T1, T2>>, ImplClass<T1, T2>> {
@Override
void doSomething(ImplClass<T1, T2> baseClassInstance) {...}
}
因此,我可以提供一个 EMPTY 接口,仅用于类型转换以减少泛型变量:
interface ImplManipulator<T1, T2> extends Manipulator<List<Foo<T1, T2>>, ImplClass<T1, T2>>{
// actually empty
}
并且实现看起来像:
class ManipulatorA<T1, T2> implements ImplManipulator<T1, T2> {
@Override
void doSomething(ImplClass<T1, T2> baseClassInstance) {...}
}
class ManipulatorB<T1, T2> implements ImplManipulator<T1, T2> {
@Override
void doSomething(ImplClass<T1, T2> baseClassInstance) {...}
}
拥有一堆空接口对我来说似乎不太可读。 也不必一直考虑巨大的通用签名。 在处理这种情况时,我能做些什么来生成更好的代码?
【问题讨论】:
-
在这种情况下是
Foo<T1, T2>常量因素还是您要声明例如BaseClass<List<String>>也是? -
Well Foo
只是一个非常常用的类型的例子。但这不是一个恒定的因素,所以我也可能会使用一个额外的中间类 ListBaseClass extends BaseClass - > implements Iterable
并为此提供一个额外的(空)接口。我猜仍然不会有太大变化。