我正在开发一个小型的Android应用程序,我将一些java类和接口与kotlin混合在一起 . 我想从一个名为 MvpViewStateActivity
的泛型类型参数的java类扩展:
abstract class MvpViewStateActivity<V extends MvpView, P extends MvpPresenter<V> > { ... }
其中 MvpView
只是一个空的java接口:
interface MvpView { ... }
和 MvpPresenter
是一个像这样的java接口:
interface MvpPresenter<V extends MvpView> { ... }
和 SearchViewActivity
(Java):
class SearchActivity extends MvpViewStateActivity<SearchView, SearchPresenter>
implements SearchView { ... }
所以现在我创建一个kotlin接口 SearchView
:
interface SearchView : MvpView {
fun setItems( items : List<Item> )
}
其中 Item
是一个pojo数据类 .
SearchPresenter
也写在kotlin中:
interface SearchPresenter : MvpPresenter<SearchView> { ... }
总结一下:
Java类:
-
MvpViewStateActivity
-
MvpView
-
MvpPresenter
-
SearchViewActivity
Kotlin类/接口
-
SearchView扩展MvpView(java)
-
SearchPresenter扩展MvpPresenter(java)
当我尝试编译该代码时,我收到以下错误:
error:类型参数SearchView不在类型变量V的范围内,其中V是类型变量:V扩展在类MvpViewStateActivity中声明的MvpView
但 SearchView : MvpView
(换句话说 SearchView extends MvpView
) .
编译器指向该行代码:
SearchActivity扩展了MvpViewStateActivity < SearchView
我忽略了什么吗?这是一个kotlin bug吗?
1 回答
我无法重现“不在界限内”的问题 .
这是我第一次使用Kotlin,所以让我解释一下我做了什么,这样你就可以验证 . 为了清楚起见,我更改了类名 .
使用Java 7,Eclipse,创建一个包含“泛型”包的Java项目 . 创建两个文件:
和
下载Kotlin编译器版本1.0.0-beta-2423,从项目"bin\generics"文件夹中提取并复制
IView.class
和IPresenter.class
到新的"kotlin\generics"文件夹中 . 在"kotlin\generics"文件夹中创建KGenericViewPresenter.kt
:跑:
bin\kotlinc -cp . generics\KGenericViewPresenter.kt
回到Java项目,添加类文件夹"fromkotlin",在其中创建一个"generics"文件夹,并从"kotlin\generics"文件夹中复制
ISearchView.class
和ISearchPresenter.class
.刷新Java项目(以便从Kotlin中获取两个新类) .
在Java项目中创建两个新文件:
和
Eclipse没有抱怨,该项目的"bin\generics"文件夹包含文件
AbstractViewStateActivity.class
和ViewStateActivity.class
.如果这是一个有效的测试,请尝试刷新IDE环境,并确保包中没有名为
V
或P
的类(也检查单元测试类) .