【发布时间】:2018-05-04 13:07:11
【问题描述】:
我有以下工作 Java 代码,但是当我将其转换为 Kotlin 时,代码无法编译
Java代码
public interface Presenter<V> {
void attachView(V view);
}
实现上述接口的抽象类
public abstract class BasePresenter<T> implements Presenter<T> {
@Override
public void attachView(T view) {
this.view = view;
}
}
采用实现上述接口的 Type 参数的抽象类
public abstract class PresenterActivity<P extends Presenter> extends BaseActivity {
protected P presenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (presenter != null) {
presenter.attachView(this);
}
}
}
扩展 BasePresenter 的类
public class FooPresenter extends BasePresenter<BarView> {
...
}
一个扩展 PresenterActivity 的类
public class SomeActivity extends PresenterActivity<FooPresenter> implements BarView {
....
}
Kotlin 从上面的 Java 代码转换而来的代码
interface Presenter<in V> {
fun attachView(view: V)
}
实现上述接口的抽象类
abstract class BasePresenter<V> : Presenter<V> {
override fun attachView(view: V) {
this.view = view
}
}
采用Type参数实现上述接口的抽象类,不确定下面的<P : Presenter<Any>>是否是正确的表达方式
abstract class PresenterActivity<P : Presenter<Any>> : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (presenter != null) {
presenter!!.attachView(this)
}
}
}
扩展 BasePresenter 的类
class FooPresenter : BasePresenter<BarView>() {
....
}
一个扩展 PresenterActivity 的类
class SomeActivity : PresenterActivity<FooPresenter>(), BarView {
....
}
Kotlin 类 PresenterActivity 给出以下编译错误
错误:(9, 44) 类型参数不在其范围内:应该是 'Presenter<Any>' 的子类型
这意味着FooPresenter 不会被识别为Presenter<Any> 的子类型
我假设Presenter<V> 是Presenter<Any> 的子类,我感觉我错了
【问题讨论】: