java - 减少类型层次结构中的泛型变量的最佳实践?

标签 java generics

我想知道在包含类型层次结构和许多泛型变量时,是否有可能使 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 可能会有所帮助
  • 正确放置它们。如果您仅创建内部子类,则不要创建具有空接口(interface)的新文件 - 将其放在子类所在的同一文件中。如果您只在一个包中创建子类,请创建一个类 TypeAliases 并将它们放置在包 scoppe 的所有接口(interface)中。如果你在全局范围内需要它,创建一个包typeAliases,把所有东西都放在那里,再也不会看那里了

另一种选择是简单地放弃泛型。人们经常使用 hamcrest 匹配器这样做,因为它们的长签名会降低可读性。毕竟泛型是为了帮助你,而不是让你的生活更艰难(至少那是想法)

关于java - 减少类型层次结构中的泛型变量的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29781281/

相关文章:

swift - 如何比较 Swift 中的泛型对象?

java - 为什么我会收到此错误 "Type mismatch: cannot convert from Serializable to T"?

java - 如何从 SSL 连接获取公钥

java - Hibernate 映射 - 具有相同列的两个表引用一个具有外键的表

java - 通过 Firebase 身份验证的最新更改。谷歌登录?

java - 在运行时创建具有泛型类型的类

c# - 如何在 C# 中找到泛型类的属性?

Java NTP 客户端

java - 使用 throws 子句声明从未在方法主体中抛出的已检查异常

C#:通用 T 的默认值?不为空;行为随着通用约束而改变