繁体   English   中英

Java递归通用和通配符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM