我有以下两个接口:
/** * 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> { }