gpt4 book ai didi

Java 多次嵌套通配符绑定(bind)类型或作为泛型类型参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:04 24 4
gpt4 key购买 nike

我有一个带有嵌套通配符有界类型的有界类型参数的类。在类中,我需要在多个方法中使用绑定(bind)嵌套参数的类型。有没有一种方法可以将通配符有界类型定义为泛型类型参数,或者将其分配给泛型变量名,以便在多个地方轻松引用它?

现在类的实现方式是这样的

    class AbstractManager<F extends Filter<? extends Criteria<? extends Type>>>
{
protected void setFilter(F filter)
{
setCriteria(f.getCriteria());
}

protected <T extends Criteria<? extends Type>> void setCriteria(List<T> criteria)
{
}

protected <T extends Criteria<? extends Type>> void doSomethingWithCriteria(List<T> criteria)
{
...
}
}

实际上并没有将列表的类型限制为过滤器的类型,但在我们的情况下已经足够好了。理想情况下,列表的类型将限制为使用一种构造的过滤器类型,该构造可以将过滤器的推断类型绑定(bind)到一个名称,就像方法上的有界类型参数一样,而是在类级别。

基本上我想做类似的事情

    class <G extends Criteria<? extends Type> AbstractManager<F extends Filter<G>>

据我所知和发现,这是不可能的,但我希望 Java 7 中可能有一个模糊的特性或新特性可以使这成为可能。我知道可以指定第二个类型参数,例如

    class AbstractManager<F extends Filter<G>, G extends Criteria<? extends Type>>

但我不希望子类必须在编译器可以确定时指定 G。

我能够找到的唯一可能的选项/解决方案是在 solution 中提供一个带有工厂方法的浅层子类。对于这个问题 Nested Type Parameters in Java并在 Java generics - use same wildcard multiple times

最佳答案

如果我理解你打算做什么,它会改变你的类的语义。现在在您当前的类(class)中,您可以举个例子:

class T1 extends Type {}
class T2 extends Type {}
class C1 extends Criteria<T1> {}
class C2 extends Criteria<T2> {}
class C3 extends Criteria<T2> {}
class F1 extends Filter<C1> {}
class Manager extends AbstractManager<F1> {}

然后,即使 Manager 基于 F1,一些用户代码如果这样做也是完全合法的:

Manager m = new Manager();
C2 c2 = new C2();
C3 c3 = new C3();
m.setCriteria(Arrays.asList(new C2[]{c2});
m.doSomethingWithCriteria(Arrays.asList(new C3[]{c3});

我不知道这是否是您的意图,但它是合法的(从编译器的角度来看)。但是,如果您能够以某种方式命名该通配符类型,通过在您的方法中使用该名称,您将限制您的类的用户在所有方法中使用相同的类型。换句话说,在我的示例中,必须使用 C1 列表调用方法。

作为结论,如果您想要示例所具有的灵 active ,则需要重复通配符;但是如果你想要一个约束,即这些方法使用与管理器过滤器相同的标准,那么你实际上给出了解决方案:

class AbstractManager<F extends Filter<G>, G extends Criteria<? extends Type>>

(或创建一个专用的子类型以避免重复,正如您提到的(您不喜欢的任何内容?))

关于Java 多次嵌套通配符绑定(bind)类型或作为泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17493615/

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