Java 仿制药难题

Java 仿制药难题,java,generics,nested-generics,Java,Generics,Nested Generics,我正试图弄清楚如何让泛型跳转 我有: interface Root { } interface Middle extends Root { } class Type implements Root { } 和许多“子类型”类: 我想要声明一个具有两个类型参数T和S的类,其中T由type绑定,S由T和Middle绑定 我无法用泛型来确保S扩展t并实现Middle。 我想要的是: class Handler<T extends Root, S extends T, S extends Mid

我正试图弄清楚如何让泛型跳转

我有:

interface Root { }
interface Middle extends Root { }
class Type implements Root { }
和许多“子类型”类:

我想要声明一个具有两个类型参数
T
S
的类,其中
T
type
绑定,
S
T
Middle
绑定

我无法用泛型来确保
S
扩展
t
并实现
Middle
。 我想要的是:

class Handler<T extends Root, S extends T, S extends Middle>;
类处理程序;

类处理程序;

当然,这两种情况都不合法。也许我缺少了一些魔力?

尝试引入一个抽象类,该类扩展了
子类型
,并实现了
中间类型
,因此它的类型可以在
处理程序中使用

abstract class MiddleSubtype extends Subtype implements Middle { }
那么

类处理程序{/。。。
编辑:问题更新后,同样的想法如下:

abstract class MiddleType extends Type implements Middle { }

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

class Handler<T extends Root, S extends MiddleType> {  //...
抽象类MiddleType扩展类型实现Middle{}
类子类型1扩展了中间类型{}
类子类型2扩展了中间类型{}
...
类处理程序{//。。。

或者您可以将S本身设置为通用:

interface SInt<A,B> {}
class Handler<T extends Root, S extends SInt<T, Middle>>{}
接口SInt{}
类处理程序{}

您不能这样做。您可以有多个边界,但它们必须是0-1类加上多个接口。在多个边界的情况下,您不能有泛型类型。我怀疑保留了此限制,因为允许在多个边界中输入类型会给语法检查器带来很大的复杂性,这是一种罕见的边缘情况。相关:谢谢。这也是我读到的,但我认为我可能在规范中遗漏了一些东西。确实如此!你能解释一下为什么声明
Handler
是不够的吗?唯一的区别是
t
可能是比
S
更具体的类型,就是这样。
Handler
意味着Handler绑定到一个子类型。我有几个,这意味着处理程序不再是跨子类型的通用处理程序。实际上,我的代码有六个子类型,这意味着绑定到特定子类型的处理程序数量相等。请注意,这不同于
T extends Root,S extends T…
,因为
S
不再受
T
的约束。是的它将处理程序与一个子类型联系起来。实际上,我有一堆子类型,这意味着也有一堆处理程序,这正是我试图避免的。@NickPalmer查看我对这个答案的编辑-我认为这与rgettman的建议很接近。这实际上对提出的修订问题有效,因此我接受它。不幸的是我的真实类型层次结构更为复杂,因此我一直在使用强制转换。可以说这是一个问题过于简化的例子,而泛型的限制是有问题的。@NickPalmer如果你有时间提出一个后续问题,我相信人们会感兴趣的。
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> {  //...
interface SInt<A,B> {}
class Handler<T extends Root, S extends SInt<T, Middle>>{}