代码之家  ›  专栏  ›  技术社区  ›  uckelman

如何参数化使用通配符参数扩展类型的类型?

  •  1
  • uckelman  · 技术社区  · 16 年前

    我在扩展参数化类型的类型上有一个参数化接口,该接口包含一个需要扩展类型的类型参数的方法。在代码中,这是我想要的:

    class Thingy<X> { ... }
    
    interface Foo<P extends Thingy<?>> {
      <T> T frobnicate(P<T> a);
    }
    

    但这并不能编译。为了妥善 frobnicate Thingy ,有必要知道 东西 Foo s可能专门用于处理特定类型的 s(例外情况是它们必须能够处理任何类型的 T 任何 已在上参数化)。

    (顺便说一句,我已经发现了 these questions . 前者只需要一个泛型参数;我不在乎这里是需要一个,两个还是五个,只要有解决办法。后者在对应于my的类中具有特定类型而不是通配符 ,因此,就我所见,这里的解决方案不适用。)

    编辑:

    东西 我想要的是小的,我可以通过子类化得到同样的效果 东西 并创建另一个界面来处理这些问题:

    interface Foo {
      <T> T frobnicate(Thingy<T> a);
    }
    
    class SpecialThingy<T> extends Thingy<T> { ... }
    
    interface Bar {
       <T> T frobnicate(SpecialThingy<T> a);
    }
    

    这并不像我希望的那样优雅,但在这种情况下它会起作用。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Esko Luontola    16 年前

    而不是使用扩展的类型参数 Thingy<T> T 并添加 Thingy 在需要的地方使用以下部件:

    class Thingy<X> { }
    
    interface Foo<X> {
      X frobnicate(Thingy<X> a);
    }
    

    或者如果您需要使用Thingy的特定子类,那么这个如何?

    class Thingy<X> { }
    
    interface Foo<X, T extends Thingy<X>> {
      X frobnicate(T a);
    }
    

    还有一种可能是,通过更好的设计,您可以避免使用泛型表达此类内容。为了对此提出建议,有必要更多地了解这些事情是如何发生的 习惯于 还有一个比Thingies和Foos更具体的例子。

    编辑:

    interface Foo {
      <T> T frobnicate(Thingy<T> a);
    }
    

    遵循 Liskov substitution principle