genericstypes参数不在范围内
我正在一个小演示Android应用程序,我在一些java类和接口与kotlin混合。 我想扩展名为MvpViewStateActivity
genericstypes参数的java类:
abstract class MvpViewStateActivity<V extends MvpView, P extends MvpPresenter > { ... }
MvpView
只是一个空的java接口:
interface MvpView { ... }
而MvpPresenter
是这样一个java接口:
interface MvpPresenter { ... }
和SearchViewActivity
(Java):
class SearchActivity extends MvpViewStateActivity implements SearchView { ... }
所以现在我创建一个kotlin接口SearchView
:
interface SearchView : MvpView { fun setItems( items : List ) }
Item
是pojo数据类。
SearchPresenter
也是用kotlin编写的:
interface SearchPresenter : MvpPresenter { ... }
所以总结一下:
Java类:
- MvpViewStateActivity
- MvpView
- MvpPresenter
- SearchViewActivity
Kotlin类/接口
- SearchView扩展MvpView(java)
- SearchPresenter扩展MvpPresenter(java)
当我尝试编译该代码时,出现以下错误:
错误:types参数SearchView不在typesvariablesV的范围内,其中V是typesvariables:V扩展在类MvpViewStateActivity中声明的MvpView
但是, SearchView : MvpView
(换句话说, SearchView extends MvpView
)。
编译器指向那行代码:
SearchActivity扩展了MvpViewStateActivity < SearchView
我可以俯视吗? 这是一个kotlin错误?
我不能重现“不在界限”问题。
这是我第一次使用Kotlin,所以让我解释我做了什么,这样你就可以validation了。 为了清楚起见,我改变了class级名称。
使用Java 7,Eclipse,创建一个包含“generics”包的Java项目。 创建两个文件:
package generics; public interface IView {}
和
package generics; public interface IPresenter {}
下载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 {}
跑:
bin\kotlinc -cp . generics\KGenericViewPresenter.kt
回到Java项目中,添加类文件夹“fromkotlin”,在其中创建一个“generics”文件夹,并从“kotlin \ generics”文件夹复制ISearchView.class
和ISearchPresenter.class
。
刷新Java项目(以便拾取来自Kotlin的两个新类)。
在Java项目中创建两个新文件:
package generics; public abstract class AbstractViewStateActivity> {}
和
package generics; public class ViewStateActivity extends AbstractViewStateActivity implements ISearchView {}
Eclipse不会抱怨,项目的“bin \ generics”文件夹包含文件AbstractViewStateActivity.class
和ViewStateActivity.class
。
如果这是一个有效的测试,请尝试刷新IDE环境,并确保包中没有名称为V
或P
(也请检查unit testing类)。