gpt4 book ai didi

java - Java 泛型的类型别名

转载 作者:IT老高 更新时间:2023-10-28 21:09:08 25 4
gpt4 key购买 nike

我有一组相当复杂的 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>> 设置一个简单的“类型别名”。等,比如 FooBBQFooBZQ .

我目前的想法是定义包装类:

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) { ... }
}

这很好用,但也有一些缺点:

  1. 我们需要为每个通用实例定义单独的包装器。包装类很短且风格化,但我想不出一种宏化它们的方法。
  2. 我们有调用 valueOf 的转换开销(概念上,如果不是操作上的话)和 toGenericFooBBQ 之间转换和 Foo<Bar<Baz,Qux>> .例如,如果 doIt调用一些需要 Foo<Bar<Zot,Qux>> 的库例程(真正的实现会这样做),我们最终会得到类似

    return FooBBQ.valueOf( libraryCall( fooBZQ.toGeneric() ) )

    我们原本应该有的地方

    return libraryCall(fooBZQ);

还有其他方法可以在这里获得我想要的“类型别名”行为吗?也许使用一些第三方宏工具集?或者我是否需要接受我将不得不进行大量输入,一种方式(在实现中使用泛型类型)或另一种方式(为它们编写包装器)?也许让这么多泛型参数飞来飞去只是个坏主意,我需要重新考虑这个问题?

[更新] 好的,我禁止任何进一步的“不要那样做”的答案。理所当然地认为 Foo<Bar<Baz,Qux>>在我的问题域中具有真正的值(value)(Pete Kirkham 可能是正确的,它具有 足够 的值(value)来获得具有描述性名称的适当包装类)。但这是一个编程问题;不要试图定义问题。

最佳答案

如果您想要完全类型安全,我认为如果没有某种包装类,您将无法做得更好。但是,为什么不让这些类继承/实现原始的通用版本,就像这样:

public class FooBBQ extends Foo<Bar<Baz,Qux>> {
...
}

这消除了对 toGeneric() 方法的需要,而且在我看来更清楚的是,它只是一个类型别名。此外,可以将泛型类型转换为 FooBBQ 而不会发出编译器警告。如果可能的话,我个人倾向于制作 Foo, Bar, Baz... 接口(interface),即使在实现中会出现一些代码重复。

现在,在不知 Prop 体问题领域的情况下,很难说您是否需要,比如 FooBBQ,就像在您的示例中一样,或者可能是:

public class FooBar<X, Y> extends Foo<Bar<X, Y>> {
...
}

另一方面,您是否考虑过简单地将 Java 编译器配置为不显示一些泛型警告,而简单地省略泛型定义的部分?或者,使用策略性放置的 @SuppressWarnings("unchecked")?换句话说,你能不能让 DoableImpl 只“部分泛化”:

class DoableImpl implements Doable<Foo<Bar>>,Foo<Bar>> {
Foo<Bar> doIt(Foo<Bar> foobar) { ... }
}

为了减少代码困惑而忽略警告?同样,如果没有具体示例,很难做出决定,但这是您可以尝试的另一件事。

关于java - Java 泛型的类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/683533/

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