作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通用容器接口(interface),用于抽象 Android SparseArray
在Java代码中:
public interface MyContainer<T> {
T get(int key);
void forEach(Consumer<T> consumer);
}
我有一个类,其容器为 Implementation
,但我只想暴露Interface
外部:
MyContainer<Implementation> data;
Interface get(int key) {
return data.get(key);
}
void method(Consumer<Interface> callback) {
data.forEach(callback); //here
}
但是我收到编译器错误:
error: incompatible types: Consumer<Interface> cannot be converted to Consumer<Implementation>
我怎样才能改变MyContainer
接口(interface)允许 Consumer<Interface>
传递给我的类(class)?
最佳答案
在 MyContainer
,Consumer
的类型参数可以有 T
作为下限。
void forEach(Consumer<? super T> consumer);
这样就消耗了 T
的父类(super class)型。可以作为参数传入。
对于Consumer
本身,如果它可以处理 T
的父类(super class)型,那么它可以处理 T
以及。这是 PECS 的一部分 - 生产者扩展,消费者 super 。
然后,在 method
,你可以通过 Consumer<Interface>
至forEach
。在这里,T
是 Implementation
。类型Interface
是 Implementation
的父类(super class)型,所以这是下限允许的。
关于java - 泛型参数接口(interface)回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55250075/
我是一名优秀的程序员,十分优秀!