【问题标题】:Java nested wildcard bound types multiple times or as generic type parameterJava 嵌套通配符绑定类型多次或作为泛型类型参数
【发布时间】:2013-07-03 20:04:04
【问题描述】:

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

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

    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。

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

【问题讨论】:

  • 你能提供一个你想要的最终结果的样本吗?

标签: java generics type-parameter nested-generics


【解决方案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>>

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

【讨论】:

  • 你是对的,当前实现允许 setCriteria/doSomethingWithCriteria 中的类型与过滤器中定义的类型不同,因此问题和需要一些其他构造/机制,例如在类级别命名约束像class &lt;G extends Criteria&lt;? extends Type&gt; 或者通过具有第二个参数的解决方案非理想地解决。我应该在问题中更清楚地说明这一点。
  • 好的,那么我认为你的问题的简短回答是不幸的:'不'......你是对的,一个不那么冗长的机制会很好。我认为最好的甚至可以在描述中命名通配符。例如:class AbstractManager&lt;F extends Filter&lt;C extends Criteria&lt;T extends Type&gt;&gt; 能够在课堂的任何地方重复使用FCT。您可以随时向社区推荐 Java 9 :)
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多