我正在开发一个小型的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类:
Kotlin课程/接口
当我尝试编译该代码时,我收到以下错误:
错误:类型参数SearchView不在type-variable的范围内 V其中V是一个类型变量:V扩展了在类中声明的MvpView MvpViewStateActivity
但是SearchView : MvpView
(换言之SearchView extends MvpView
)。
编译器指向该行代码:
SearchActivity扩展了MvpViewStateActivity&lt; SearchView
我忽略了什么吗? 这是一个kotlin bug吗?
答案 0 :(得分:0)
我无法重现“不在界限内”的问题。
这是我第一次使用Kotlin,所以让我解释一下我做了什么,这样你就可以验证。 为了清楚起见,我更改了类名。
使用Java 7,Eclipse,创建一个包含“泛型”包的Java项目。 创建两个文件:
package generics;
public interface IView {}
和
package generics;
public interface IPresenter<VIEW extends IView> {}
下载Kotlin编译器版本1.0.0-beta-2423,从项目“bin \ generics”文件夹中提取并复制IView.class
和IPresenter.class
到新的“kotlin \ generics”文件夹中。
在“kotlin \ generics”文件夹中创建KGenericViewPresenter.kt
:
package generics
interface ISearchView : IView {}
interface ISearchPresenter : IPresenter<ISearchView> {}
执行命令
bin\kotlinc -cp . generics\KGenericViewPresenter.kt
回到Java项目,添加类文件夹“fromkotlin”,在其中创建一个“generics”文件夹并复制
来自“kotlin \ generics”文件夹的ISearchView.class
和ISearchPresenter.class
。
刷新Java项目(以便从Kotlin中获取两个新类)。
在Java项目中创建两个新文件:
package generics;
public abstract class AbstractViewStateActivity<VIEW extends IView, PRESENTER extends IPresenter<VIEW>> {}
和
package generics;
public class ViewStateActivity extends AbstractViewStateActivity<ISearchView, ISearchPresenter>
implements ISearchView {}
Eclipse没有抱怨,项目的“bin \ generics”文件夹包含文件AbstractViewStateActivity.class
和ViewStateActivity.class
。
如果这是一个有效的测试,请尝试刷新IDE环境,并确保包中没有名为V
或P
的类(也检查单元测试类)。< / p>