【问题标题】:Generics Puzzler泛型谜题
【发布时间】:2013-03-18 06:54:25
【问题描述】:

我正试图弄清楚如何让泛型越过障碍。

我有:

interface Root { }
interface Middle extends Root { }
class Type implements Root { }

还有许多“子类型”类:

class Subtype1 extends Type implements Middle { }
class Subtype2 extends Type implements Middle { }
...

我想要声明一个具有两个类型参数TS 的类,其中TType 绑定,STMiddle 绑定。

我看不出用泛型来确保S 扩展T 并实现Middle。 我想要的是这样的:

class Handler<T extends Root, S extends T, S extends Middle>;

class Handler<T extends Root, S extends <T extends Middle>>;

当然,两者都不合法。也许我缺少一些魔法?

【问题讨论】:

  • 你不能这样做。您可以有多个边界,但它们必须是 0-1 类加上多个接口。在多重绑定的情况下,您不能拥有通用类型。我怀疑这个限制被保留了,因为允许输入多个边界会给语法检查器带来很多复杂性,这是一种罕见的边缘情况。
  • 谢谢。那也是我的阅读,但我认为我可能在规范中遗漏了一些东西。铸造它是!
  • 您能解释一下为什么声明Handler&lt;T extends Root, S extends Subtype&gt; 还不够吗?唯一的区别是T 可能是比S 更具体的类型,仅此而已。
  • Handler&lt;T extends Root, S extends Subtype&gt; 表示 Handler 绑定到单个 Subtype。我有几个,这意味着 Handler 不再是跨子类型的泛型。实际上,我的代码有六个子类型,这意味着绑定到特定子类型的处理程序数量相等。

标签: java generics nested-generics


【解决方案1】:

尝试引入一个扩展SubType并实现Middle的抽象类,使其类型可以在Handler中使用。

abstract class MiddleSubtype extends Subtype implements Middle { }

那么,

class Handler<T extends Root, S extends MiddleSubtype> {  //...

编辑:随着问题的更新,同样的想法看起来像:

abstract class MiddleType extends Type implements Middle { }

class Subtype1 extends MiddleType { }
class Subtype2 extends MiddleType { }
...

class Handler<T extends Root, S extends MiddleType> {  //...

【讨论】:

  • 请注意,这与T extends Root, S extends T ... 不同,因为S 不再受T 的约束。
  • 是的,它将 Handler 绑定到一个子类型。我实际上有一堆子类型,这也意味着一堆处理程序,这正是我试图避免的。
  • @NickPalmer 查看我对这个答案的编辑 - 我认为这接近 rgettman 的建议。
  • 这确实适用于提出的修改后的问题,所以我接受它。不幸的是,我的真实类型层次结构更加复杂,所以我被强制转换。将其称为问题过度简化和泛型限制存在问题的情况。
  • @NickPalmer 如果你有时间提出一个后续问题,我相信人们会感兴趣的。
【解决方案2】:

或者你可以让 S 本身成为泛型:

interface SInt<A,B> {}
class Handler<T extends Root, S extends SInt<T, Middle>>{}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多