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>>{}