Kotlin Pass中实现了一个参数化界面的types

我有以下工作的Java代码,但是当我把它转换成Kotlin,代码不能编译

Java代码

public interface Presenter { void attachView(V view); } 

实现上述接口的抽象类

 public abstract class BasePresenter implements Presenter { @Override public void attachView(T view) { this.view = view; } } 

带有实现上述接口的Type参数的抽象类

 public abstract class PresenterActivity

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 { ... } 

一个扩展PresenterActivity的类

 public class SomeActivity extends PresenterActivity implements BarView { .... } 

从上面的Java代码转换Kotlin代码

 interface Presenter { fun attachView(view: V) } 

实现上述接口的抽象类

 abstract class BasePresenter : Presenter { override fun attachView(view: V) { this.view = view } } 

抽象类接受一个实现了上面接口的Type参数,不知道下面的<P : Presenter>是否是正确的expression式

 abstract class PresenterActivity<P : Presenter> : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (presenter != null) { presenter!!.attachView(this) } } } 

一个扩展BasePresenter的类

 class FooPresenter : BasePresenter() { .... } 

一个扩展PresenterActivity的类

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

Kotlin类PresenterActivity给出了以下编译错误错误:(9,44)types参数不在其范围内:应该是“ Presenter ”的子types

这意味着FooPresenter不会被记录为Presenter的子types

我假设PresenterPresenter一个子类,我感觉是错的

您的Java代码实际上有一个types安全问题: PresenterActivity

使用一个原始types ,当您以后编写presenter.attachView(this)您不知道是否可以附加thistypes,但是原始types意味着编译器不会“不要警告你。 Kotlin不会让你像这样隐藏它。

我假设PresenterPresenter一个子类,我感觉是错的

实际上意味着PresenterPresentertypes,而不是子types。 看https://kotlinlang.org/docs/reference/generics.html (或者搜索协变和逆变,堆栈溢出和其他方面有很多解释,虽然更多的是Scala而不是Kotlin,但是这个想法是一样的)。

我认为最简单的解决方案就是这样的

 // concrete subclasses must extend V abstract class PresenterActivity> : BaseActivity() { ... presenter!!.attachView(this as V) } 

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