首页 文章

Generic Type参数不在边界内

提问于
浏览
0

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

  • 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 的类(也检查单元测试类) .

相关问题