微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 几乎循环类型绑定的递归类型参数

我有以下两个接口:
/**
 * A marker interface to denote that an object implements a view on some other object.
 *
 * @param <T>   The type of object that is viewed
 */
public interface View<T extends Viewable<View<T>>> {

}
/**
 * An interface for objects that are viewable via a view.
 * 
 * @param <T>   The type of viewable object
 */
public interface Viewable<T extends View<?>> {
    public void addViewCallback(final T view);

    public void removeViewCallback(final T view);
}

我想执行以下操作:

> View(称为(a))的type参数应该是可视的视图(a).
>可视化的类型参数(称为(b))应该是一个视图,它可以通过同一个可视(b)查看.

我认为我已经完成了对View的限制,但是我如何使它们可视化?我现在得到的是编译,但没有提供足够的保护.

我现在不能制定一些我不想要接受的东西,但是我可以制定我想要的东西,如果这有帮助的话:

> public class Hand implements< HandView>
> public interface HandView扩展View< Hand>

解决方法

正如@SimonAndréForsberg所讨论的那样,编程太过防守往往是不必要的浪费时间,我们应该相信我们自己的声明.

但是,为了获得乐趣,这里是一个解决方案,可以在编译时强制执行所有在类/接口声明上的限制.

声明

视图界面:

public interface View<T extends Viewable<T,?>> {}

>这里,我们只想确保type参数是可视的.
>第二个类型的参数不需要限制,因为Viewable的声明将不允许可视的< T,?>如果存在?本身不是View< T>.

可视界面:

public interface Viewable<T extends Viewable<T,?>,V extends View<T>> {
    public void addViewCallback(final V view);
    public void removeViewCallback(final V view);
}

>这里,T需要被声明为可见,因为我们将其用作View< T>的类型参数.在行尾.
>与以前一样,不需要限制?因为我们说之后,第二个类型的参数需要是一个View< T>如果第一类参数是T.

用法

public class Hand implements Viewable<Hand,HandView> {
    @Override
    public void addViewCallback(HandView view) {}

    @Override
    public void removeViewCallback(HandView view) {}

}

public interface HandView extends View<Hand> {
}

原文地址:https://www.jb51.cc/java/122066.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐