Java Kotlin传入实现参数化接口的类型
我有下面的Java代码,但是当我将其转换为Kotlin时,代码不会编译 Java代码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
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{
....
}