我正在开发一个小的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类:
静态编程语言类/接口
当我尝试编译该代码时,我得到了以下错误:
错误:类型参数SearchView不在类型变量V的范围内,其中V是类型变量:V扩展了在类MvpViewStateActivity中声明的MvpView
但是,SearchView:MvpView(换句话说,SearchView扩展了MvpView)。
编译器指向那行代码:
搜索活动扩展MvpViewStateActive
我是否忽视了什么?这是kotlin臭虫吗?
我无法再现“不在限制范围内”的问题。
这是我第一次使用Kotlin,所以让我解释一下我做了什么,以便您可以验证。为了清楚起见,我更改了类名。
使用Java 7、Eclipse创建一个包含“泛型”包的Java项目。创建两个文件:
package generics;
public interface IView {}
和
package generics;
public interface IPresenter<VIEW extends IView> {}
下载静态编程语言编译器版本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。泛型\KGenericViewPresenter。kt
回到Java项目中,添加类文件夹“fromkotlin”,在其中创建一个“泛型”文件夹,然后复制ISearchView。类和ISearchPresenter。从“kotlin\generics”文件夹中初始化
刷新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。类和视图状态活动。类 。
如果这是一个有效的测试,请尝试刷新IDE环境,并确保包中没有名为V或P的类(同时检查单元测试类)。
问题内容: 是否有将通用类型参数约束为 任何 类型范围的语法或解决方法? 我知道您可以将一个类型限制为 所有 类型的范围(即逻辑): 是否有逻辑版本,例如: 如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法? 在某些情况下,一个示例用例可能是: 人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下: 编辑: 我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体
我正在开发一个代理适配器,使用Java中的泛型将一个请求/响应转换为另一个请求/响应。 我有一个接口: 适配器的实现(仅以请求案例为例): 抽象类: 从Java中的泛型类型推断泛型类型(编译时错误) 我在那个问题上花了大约三天时间。有什么想法吗?谢了。
问题内容: 我正在为一个涉及泛型的类项目。 当尝试在MySearchTree的声明中使用Course类时,我收到一个类型自变量错误,指出“课程不在类型变量K的范围内”。我花了很多时间试图弄清楚Course可能缺少哪些属性,以使其不符合要求,但却空洞了。 有任何想法吗? 问题答案: 在的基本类型为。因此必须“扩展” 。但是,它没有扩展。 我猜 应该以类似的方式对泛型 或 。
问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
问题内容: 我正在定义一个类: 编译器抱怨被隐藏。我猜第二次出现在定义中是第一次隐藏在范围内,好像可以将变量分配给两种不同的类型一样。如何正确做? 编辑: 这是一个内部阶级。完整的代码可以是: 现在的问题是,如果我重新提名内部人,我不确定那是和实际上是相同的类型。 问题答案: 不要将内部类参数化: 作为声明中定义的内部(非静态嵌套)类,仍将具有in的含义,因为每个类都对其外部实例具有隐式引用。