Tag: kotlin generics

Kotlin通用属性问题

在将我的Android项目从Java转换为Kotlin时,我遇到了Kotlin的一些问题。 假设我有接口I和扩展接口I的接口O. interface I{ } interface O: I{ } 通用类A具有扩展接口I的通用参数V,扩展类A的通用类B: abstract class A { } class B : A() { } 当我试图创建这样的属性: val returnB: A get() = b 我得到编译器错误“需要A,findB”。 在Java中,这将工作没有任何问题。 我怎样才能使用Kotlin访问? 我需要在我的应用程序中使用这种方法的基本类。 具有Navigator类的generics参数的BaseViewModel: abstract class BaseViewModel(application: Application, val repositoryProvider: RepositoryProvider) : AndroidViewModel(application) { var navigator: N? = null fun onDestroyView() { navigator = null } […]

Kotlin覆盖子types的乐趣

我无法inheritance包含一个基types的方法/乐趣的接口,我想重写作为实现它的类中的子types。 到目前为止,我有界面 interface IModel { fun convert(dataModel: BaseDataModel) } 而实施它的class级: class SettingsModel: IModel { override fun convert(dataModel: BaseDataModel) { // Conversion of models here } } 而且我也有SettingsDataModel这是: class SettingsDataModel: BaseDataModel() { } 我想要实现的是每个类/模型实现IModel,能够得到具体的DataModel,如: class SettingsModel: IModel { override fun convert(dataModel: SettingsDataModel) { // Conversion of models here } } 而不需要施放它。 我想我不能,因为它修改了有趣的签名,使它不是一个真正的重写。 我尝试使用generics和通用约束,但没有运气: interface IModel { […]

使用默认值推断类types的参数

我有一个这样的构造函数类声明 class Facade( val kClass: KClass = SuperClass::class ) 这样做是为了让开发人员不必指定SuperClass,如果他们想使用它而不是一个子类。 甚至发送类types的原因是,所以开发人员不必在尖括号中指定types。 但现在出现这个问题。 像下面这样创建实例,表示没有足够的信息来推断参数T.这导致必须将类放在尖括号中。 Facade() 但是由于默认值是SuperClass,所以kotlin应该能够将参数T推断为SuperClass。 我在想什么错 谢谢 TL; DR: Facade(SubClass:class) // working Facade(SuperClass:class) // working, but don’t want (superclass is default) Facade() // working, but don’t want angle brackets Facade() // not working, cannot infer T type from default, why?

Java中的Kotlingenerics错误

鉴于以下三个科林类: abstract class UseCase { fun execute(action: Action) { } } class ConcreteUseCase : UseCase<List>() class Action 我无法在java代码中编译以下行: ConcreteUseCase s = new ConcreteUseCase(); s.execute(new Action<List>());//<<<<<<< compilation error 错误说: SomeClass的<java.util.List的>不能应用于SomeClass <java.util.List > 我对kotlin还是一个新的东西,这可能是非常小的东西,但我似乎无法弄清楚。 我将不胜感激任何帮助。

Kotlin覆盖子类型的乐趣

我无法继承包含一个基类型的方法/乐趣的接口,我想重写作为实现它的类中的子类型。 到目前为止,我有界面 interface IModel { fun convert(dataModel: BaseDataModel) } 而实施它的班级: class SettingsModel: IModel { override fun convert(dataModel: BaseDataModel) { // Conversion of models here } } 而且我也有SettingsDataModel这是: class SettingsDataModel: BaseDataModel() { } 我想要实现的是每个类/模型实现IModel,能够得到具体的DataModel,如: class SettingsModel: IModel { override fun convert(dataModel: SettingsDataModel) { // Conversion of models here } } 而不需要施放它。 我想我不能,因为它修改了有趣的签名,使其不是一个真正的重写。 我尝试使用泛型和通用约束,但没有运气: interface IModel { […]

Kotlin和泛型混淆

我有一些泛型的Drawers : abstract class BaseGeoDrawer<KEY : Any, GEO : Any, ITEM : Any> abstract class BasePolygonDrawer<KEY : Any, ITEM : Any>: BaseGeoDrawer<KEY, Polygon, ITEM> class TeamAreaDrawer : BasePolygonDrawer<String, Team> abstract class BaseMarkerDrawer<KEY : Any, ITEM : Any> : BaseGeoDrawer<KEY, Marker, ITEM> class TeamPositionDrawer : BaseMarkerDrawer<String, Team> 然后我有一个接受这些Drawers的controller ,把它们放在一个ArrayList private val drawers = ArrayList<BaseGeoDrawer<Any, Any, Any>>() […]

Kotlin“out”和“in”以及泛型 – 正确的用法

我试图做一个通用的穷人的数据持久化功能,将采取MutableSet的数据类和序列化到磁盘。 我想要一个简单的原型设计,并且可以每隔一段时间在设备上调用“save()”,这样如果我的进程被终止了,我可以稍后恢复保存条目的“load()”。 但是,即使在重新读取泛型页面之后,我也不太清楚'*','in','out'和'Nothing'之间的区别。 这SEEMS的工作没有抛出错误,但我不明白为什么他们都“出”,我认为必须是“在”…或者更可能我是理解Kotlin泛型完全错误。 有没有这样做的正确方法? /** Save/load any MutableSet<Serializable> */ fun MutableSet<out Serializable>.save(fileName:String="persist_${javaClass.simpleName}.ser") { val tmpFile = File.createTempFile(fileName, ".tmp") ObjectOutputStream(GZIPOutputStream(FileOutputStream(tmpFile))).use { println("Persisting collection with ${this.size} entries.") it.writeObject(this) } Files.move(Paths.get(tmpFile), Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING) } fun MutableSet<out Serializable>.load(fileName:String="persist_${javaClass.simpleName}.ser") { if (File(fileName).canRead()) { ObjectInputStream(GZIPInputStream(FileInputStream(fileName))).use { val loaded = it.readObject() as Collection<Nothing> println("Loading collection with ${loaded.size} entries.") this.addAll(loaded) } } […]

Kotlin通用属性问题

在将我的Android项目从Java转换为Kotlin时,我遇到了Kotlin的一些问题。 假设我有接口I和扩展接口I的接口O. interface I{ } interface O: I{ } 通用类A具有扩展接口I的通用参数V,扩展类A的通用类B: abstract class A<V: I> { } class B : A<O>() { } 当我试图创建这样的属性: val returnB: A<I> get() = b 我得到编译器错误“需要A,找到B”。 在Java中,这将工作没有任何问题。 我怎样才能使用Kotlin访问? 我需要在我的应用程序中使用这种方法的基本类。 具有Navigator类的泛型参数的BaseViewModel: abstract class BaseViewModel<N>(application: Application, val repositoryProvider: RepositoryProvider) : AndroidViewModel(application) { var navigator: N? = null fun onDestroyView() { navigator = null […]