6

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

现在实现类的方式就像

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

这实际上并没有将列表的类型限制为过滤器的类型,但在我们的情况下已经足够了。理想情况下,列表的类型将被限制为过滤器的类型,使用的结构可以将过滤器的推断类型绑定到一个名称,这很像方法上的有界类型参数,但在类级别。

基本上我想做类似的事情

    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。

我能找到的唯一可能的选项/解决方案是在这个问题 的解决方案中给出一个带有工厂方法的浅子类 Java 和 Java 泛型中的嵌套类型参数- 多次使用相同的通配符

4

1 回答 1

1

如果我了解您打算做什么,它将改变您班级的语义。现在,在您当前的班级中,您可以拥有例如:

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.

作为结论,如果您希望示例具有灵活性,则需要重复通配符;但是,如果您想要限制方法使用与管理器过滤器相同的标准,那么您实际上给出了解决方案:

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

(或者创建一个专用的子类型以避免重复,正如你所提到的(你不喜欢的任何东西?))

于 2014-03-28T09:00:24.750 回答