我有一个带有嵌套通配符有界类型的有界类型参数的类。在类中,我需要在多个方法中使用绑定嵌套参数的类型。有没有办法将通配符有界类型定义为泛型类型参数,或者将其分配给通用变量名称,以便可以在多个位置轻松引用它?
现在实现类的方式就像
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)
{
...
}
}
没有绑定实际上将列表的类型限制为Filter的类型,但在我们的情况下已经足够了。理想情况下,列表的类型将被限制为过滤器的类型,使用的构造可以将过滤器的推断类型绑定到一个名称,类似于方法上的有界类型参数,而不是类级别。
基本上我想做类似
的事情 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
答案 0 :(得分: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>>
(或创建一个专门的子类型,以避免重复,如你所提到的(任何你不喜欢的东西?)