通用类型参数不在范围

时间:2015-11-20 19:05:06

标签: java kotlin

我正在开发一个小型的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)

当我尝试编译该代码时,我收到以下错误:

  

错误:类型参数SearchView不在type-variable的范围内   V其中V是一个类型变量:V扩展了在类中声明的MvpView   MvpViewStateActivity

但是SearchView : MvpView(换言之SearchView extends MvpView)。

编译器指向该行代码:

SearchActivity扩展了MvpViewStateActivity&lt; SearchView

我忽略了什么吗? 这是一个kotlin bug吗?

1 个答案:

答案 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.classIPresenter.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.classISearchPresenter.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.classViewStateActivity.class

如果这是一个有效的测试,请尝试刷新IDE环境,并确保包中没有名为VP的类(也检查单元测试类)。< / p>