gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:50:35 24 4
gpt4 key购买 nike

我想知道在包含类型层次结构和许多泛型变量时,是否有可能使 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com