[英]Java recursive Generic and Wildcard
您好我有一个关于Java的问题,并使用带有递归泛型的通配符。 我有以下界面
public interface Recursive<R extends Recursive<R>> {}
和另一个使用递归接口的插件
public interface Use<R extends Recursive<R>> {}
现在我的界面看起来像这样
public interface Base<R extends Recursive<R>> {
Use<R>[] getUses();
}
并且基于该类我想要一个使用这样的通配符的派生类
public class Derived extends Base<Recursive<?>> {
Use<?>[] getUses();
}
这是不允许的,但我怎么能设法说我的通用类型是适合的一切?
问题是Recursive< ? >
Recursive< ? >
不满足Base
类型参数的约束。
如果你想扩展Base< R >
你必须为R
提供一些东西,它也是一个Recursive< R >
。 Recursive< ? >
Recursive< ? >
不够好,因为编译器无法弄清楚Recursive< ? > extends Recursive< Recursive< ? > >
Recursive< ? > extends Recursive< Recursive< ? > >
Recursive< ? > extends Recursive< Recursive< ? > >
。
扩展未知类型的Base
是没有意义的,但是您可以声明它们的异构集合:
Collection< Base< ? > > cb; // ok for some reason
Collection< Base< Recursive< ? > > > cbr; // not ok!
从您的评论我们知道Base
看起来像
public abstract class Base< R extends Recursive< R > > {
public abstract R[] foo();
}
对于每个符合资格的R
你当然可以
public class Derived< R extends Recursive< R > > extends Base< R > {
@Override public R[] foo() {
return ( R[] )new Object[] { r1, r2 };
}
}
但是你的评论并不清楚这是你想要的。 你知道你想要Derived
使用的特定R
是什么吗?
编辑以下编译。 那还够吗?
interface Recursive< R extends Recursive< R > > {}
abstract class Base< R extends Recursive< ? extends R > > {
abstract public R[] foo();
}
class Derived extends Base< Recursive< ? > > {
public Recursive< ? >[] foo() { return null; }
}
编辑2调整原始帖子的更改:
interface Recursive< R extends Recursive< R > > {}
interface Use< R extends Recursive< ? extends R > > {}
abstract class Base< R extends Recursive< ? extends R > > {
abstract public Use< R >[] foo();
}
class Derived extends Base< Recursive< ? > > {
@Override public Use< Recursive< ? > >[] foo() { return null; }
}
您需要键入(使用右边界)您的子类,否则编译器无法断言该类的通配符与您的方法返回的类型相同 ,这是必需的。
尝试这个:
public class Derived<R extends Recursive<R>> extends Base<R> {
Use<R>[] getUses();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.