Kotlin 泛型边界
Kotlin generic bounds
我正在尝试将我的 MVP 解决方案从 JAVA 移植到 Kotlin,但我对泛型有很大的疑问。这就是我的 JAVA 类 的样子:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView
public abstract class BasePresenter<V extends BaseView>
public interface BaseView
并移植到 Kotlin:
abstract class BaseActivity<P : BasePresenter<BaseView>> : AppCompatActivity(), BaseView
abstract class BasePresenter<V : BaseView>
interface BaseView
当我尝试使用
class MainActivity() : MainView, BaseActivity<MainPresenter>()
我得到 "Type argument is not within its bounds. Expected: BasePresenter, Found MainPresenter"
Java class BaseActivity
声明 P
扩展 BasePresenter<?>
而 Kotlin 版本状态 BasePresenter<BaseView>
显然不兼容。
要解决这个问题,您可以像这样放宽 BaseActivity
类型参数 P
:
abstract class BaseActivity<P : BasePresenter<*>>
或者如果您希望编译器完成更多类型检查,您可以像这样为 view
指定类型参数:
abstract class BaseActivity<TPresenter : BasePresenter<TView>, TView : BaseView> : AppCompatActivity(), BaseView
然后将其用作:
class MainPresenter : BasePresenter<MainView>()
class MainActivity() : MainView, BaseActivity<MainPresenter, MainView>()
我正在尝试将我的 MVP 解决方案从 JAVA 移植到 Kotlin,但我对泛型有很大的疑问。这就是我的 JAVA 类 的样子:
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView
public abstract class BasePresenter<V extends BaseView>
public interface BaseView
并移植到 Kotlin:
abstract class BaseActivity<P : BasePresenter<BaseView>> : AppCompatActivity(), BaseView
abstract class BasePresenter<V : BaseView>
interface BaseView
当我尝试使用
class MainActivity() : MainView, BaseActivity<MainPresenter>()
我得到 "Type argument is not within its bounds. Expected: BasePresenter, Found MainPresenter"
Java class BaseActivity
声明 P
扩展 BasePresenter<?>
而 Kotlin 版本状态 BasePresenter<BaseView>
显然不兼容。
要解决这个问题,您可以像这样放宽 BaseActivity
类型参数 P
:
abstract class BaseActivity<P : BasePresenter<*>>
或者如果您希望编译器完成更多类型检查,您可以像这样为 view
指定类型参数:
abstract class BaseActivity<TPresenter : BasePresenter<TView>, TView : BaseView> : AppCompatActivity(), BaseView
然后将其用作:
class MainPresenter : BasePresenter<MainView>()
class MainActivity() : MainView, BaseActivity<MainPresenter, MainView>()