- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想知道在包含类型层次结构和许多泛型变量时,是否有可能使 java 的泛型更具可读性和/或更易于使用。我还不是很熟悉 java 的泛型。在以下示例中可以做什么:
假设我需要以下类(class)...
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):
interface Manipulator<T, B extends BaseClass<T>> {
void doSomething(B baseClassInstance);
}
因此,在为 ImplClass 编写实现该接口(interface)的类时,我总是必须再次编写整个通用签名,不是吗?所以像这样:
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),它只用于类型转换以减少通用变量:
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) {...}
}
一堆空界面对我来说似乎不太可读。也不必一直考虑巨大的通用签名。处理这种情况时,我该怎么做才能生成更好的代码?
最佳答案
What can i do to produce better code when dealing with such situation?
改变语言...
java 不支持类型别名或 haskell 风格的新类型。如果可以,请将 Scala 添加到您的项目中。你可以混合使用 scala 和 java。
另一种选择是使用某种来源生成/预处理。甚至可能使用 AST 转换器。但这完全是习惯的,所以在不确切了解您的情况的情况下很难给您任何建议
如果您必须坚持使用 java,那么,正如您所注意到的,别名泛型类型的唯一方法是创建一个中间接口(interface)或一个类。您可以通过以下方式稍微清洁一下:
ImplManipulator
不会为您提供太多信息,但 FooListManipulator
可能会有所帮助TypeAliases
并将它们放置在包 scoppe 的所有接口(interface)中。如果你在全局范围内需要它,创建一个包typeAliases
,把所有东西都放在那里,再也不会看那里了另一种选择是简单地放弃泛型。人们经常使用 hamcrest 匹配器这样做,因为它们的长签名会降低可读性。毕竟泛型是为了帮助你,而不是让你的生活更艰难(至少那是想法)
关于java - 减少类型层次结构中的泛型变量的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29781281/
我是一名优秀的程序员,十分优秀!