Java Kotlin传入实现参数化接口的类型

Java Kotlin传入实现参数化接口的类型,java,android,types,kotlin,Java,Android,Types,Kotlin,我有下面的Java代码,但是当我将其转换为Kotlin时,代码不会编译 Java代码 public interface Presenter<V> { void attachView(V view); } 公共界面演示者{ 无效附加视图(V视图); } 实现上述接口的抽象类 public abstract class BasePresenter<T> implements Presenter<T> { @Override public

我有下面的Java代码,但是当我将其转换为Kotlin时,代码不会编译

Java代码

public interface Presenter<V> {
   void attachView(V view);
}
公共界面演示者{
无效附加视图(V视图);
}
实现上述接口的抽象类

public abstract class BasePresenter<T> implements Presenter<T> {
    @Override
    public void attachView(T view) {
        this.view = view;
    }
}
abstract class BasePresenter<V> : Presenter<V> {
    override fun attachView(view: V) {
        this.view = view
    }
}
公共抽象类BasePresenter实现Presenter{
@凌驾
公共无效附加视图(T视图){
this.view=视图;
}
}
采用实现上述接口的类型参数的抽象类

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);
        }
    }
}
公共抽象类PresenterActivity扩展BaseActivity{
受保护的P演示者;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(演示者!=null){
演示者。附件视图(此);
}
}
}
扩展BasePresenter的类

public class FooPresenter extends BasePresenter<BarView> {
    ...
}
class FooPresenter : BasePresenter<BarView>() {
    ....
}
公共类FooPresenter扩展了BasePresenter{
...
}
一个扩展PresenterActivity的类

public class SomeActivity extends PresenterActivity<FooPresenter> implements BarView {
   ....
}
class SomeActivity : PresenterActivity<FooPresenter>(), BarView {
    ....
}
公共类SomeActivity扩展PresenterActivity实现BarView{
....
}
Kotlin从上述Java代码转换而来的代码

interface Presenter<in V> {
    fun attachView(view: V)
}
界面演示者{
趣味附件视图(视图:V)
}
实现上述接口的抽象类

public abstract class BasePresenter<T> implements Presenter<T> {
    @Override
    public void attachView(T view) {
        this.view = view;
    }
}
abstract class BasePresenter<V> : Presenter<V> {
    override fun attachView(view: V) {
        this.view = view
    }
}
抽象类BasePresenter:Presenter{
覆盖趣味附件视图(视图:V){
this.view=视图
}
}
采用实现上述接口的类型参数的抽象类,我不确定下面的
是否是正确的表达式

abstract class PresenterActivity<P : Presenter<Any>> : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (presenter != null) {
            presenter!!.attachView(this)
        }
   }
}
抽象类PresenterActivity:BaseActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
如果(演示者!=null){
演示者!!.attachView(此)
}
}
}
扩展BasePresenter的类

public class FooPresenter extends BasePresenter<BarView> {
    ...
}
class FooPresenter : BasePresenter<BarView>() {
    ....
}
class FooPresenter:BasePresenter(){
....
}
一个扩展PresenterActivity的类

public class SomeActivity extends PresenterActivity<FooPresenter> implements BarView {
   ....
}
class SomeActivity : PresenterActivity<FooPresenter>(), BarView {
    ....
}
class SomeActivity:PresenterActivity(),BarView{
....
}
Kotlin类
PresenterActivity
给出了以下编译错误 错误:(9,44)类型参数不在其范围内:应为“
演示者”的子类型

这意味着
foodpresenter
不会被识别为
Presenter


我假设
Presenter
Presenter
的一个子类,我觉得我错了你的Java代码实际上有一个类型安全问题:
PresenterActivity

在你以后编写
Presenter时使用了。attachView(this)
你不知道你是否可以附加
this
,但是raw类型意味着编译器不会警告您。科特林不会让你这样隐瞒的

我假设
Presenter
Presenter的一个子类(或者搜索协方差和反方差,有很多关于堆栈溢出和其他方面的解释,虽然Scala的解释比Kotlin多,但想法是一样的)

我认为最简单的解决办法是

// concrete subclasses must extend V
abstract class PresenterActivity<V, P : Presenter<V>> : BaseActivity() {
   ... presenter!!.attachView(this as V)
}
//具体子类必须扩展V
抽象类PresentPractivity:BaseActivity(){
…演示者!!.attachView(此为V)
}

class SomeActivity:PresenterActivity(),BarView{
....
}