泛型难题

8

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

我已经有:

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

还有许多“子类型”类:

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

我希望声明一个具有两个类型参数T和S的类,其中T受Type限制,而S受T和Middle限制。使用泛型无法确保S扩展T并实现Middle。我想要的是这样的东西:
class Handler<T extends Root, S extends T, S extends Middle>;

或者

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

当然,两者都是非法的。也许我错过了什么魔法?

2
你不能这样做。你可以有多个边界,但它们必须是0-1类加多个接口。在多重绑定的情况下,你不能有一个泛型类型。我怀疑这个限制之所以被保留,是因为允许在多重边界中使用类型会给语法检查器带来很多复杂性,而这只是一个罕见的边缘案例。 - BevynQ
2
相关:https://dev59.com/dGcs5IYBdhLWcg3wJQi7#13261667 - Paul Bellora
谢谢。这也是我的理解,但我想可能在规范中漏掉了什么。那就使用转换吧! - Nick Palmer
你能解释一下为什么声明 Handler<T extends Root, S extends Subtype> 不够吗?唯一的区别是 T 可能比 S 更具体,就这样。 - Paul Bellora
Handler<T extends Root, S extends Subtype> 表示 Handler 仅绑定到单个子类型。我有几个子类型,这意味着 Handler 不再跨子类型通用。实际上,我的代码有半打子类型,这将意味着与特定子类型绑定的相同数量的处理程序。 - Nick Palmer
我进行了一些编辑,试图澄清您的问题 - 您能否请查看我的更改并让我知道是否有任何错误? - Paul Bellora
2个回答

2
尝试引入一个抽象类,该类继承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> {  //...

1
请注意,这与 T extends Root,S extends T ... 不同,因为 S 不再受 T 的限制。 - Paul Bellora
是的,它将Handler绑定到一个子类型。实际上,我有很多子类型,这意味着也会有很多Handlers,这正是我想要避免的。 - Nick Palmer
@NickPalmer 请看我对这个答案的编辑 - 我认为这接近 rgettman 的建议。 - Paul Bellora
这确实适用于所提出的修订问题,因此我接受它。不幸的是,我的真正类型层次结构甚至更加复杂,因此我被迫进行强制转换。可以称之为在问题和泛型限制方面过度简化的情况。 - Nick Palmer
@NickPalmer 如果你有时间准备一个后续问题,我相信人们会很感兴趣。 - Paul Bellora

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接