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
我假设Presenter
是Presenter
一个子类,我感觉是错的
您的Java代码实际上有一个types安全问题: PresenterActivity
使用一个原始types ,当您以后编写presenter.attachView(this)
您不知道是否可以附加this
types,但是原始types意味着编译器不会“不要警告你。 Kotlin不会让你像这样隐藏它。
我假设
Presenter
是Presenter
一个子类,我感觉是错的
实际上意味着Presenter
是Presenter
的超types,而不是子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 { .... }