Tag: 泛型

Kotlin继承与泛型

我有一个抽象类,我们称之为A. abstract class A(private val name: String) { fun read(key: String): Entity { … } fun write(entity: Entity) { … } abstract val mapper: Mapper<Any> … interface Mapper<T> { fun toEntity(entry: T): Entity fun fromEntity(entity: Entity): T } … 它有一个抽象的映射器。 重点是我可以将不同的对象映射到实体并使用write 。 我的孩子班级,我们称之为B,是这样构造的: class B(private val name: String) : A(name) { override val mapper = […]

Kotlin,通用添加

是否可以实现一个通用的,比如说,像下面这样: public abstract interface NumberEx { abstract fun plus(other: NumberEx): NumberEx } abstract interface Vec2t<T : NumberEx> { open var x: T open var y: T fun add(res: Vec2t<T>, a: Vec2t<T>, bX: T, bY: T): Vec2t<T> { res.x = ax + bX res.y = ay + bY return res } } 因为这里编译器抱怨ax + bX和ay + […]

Kotlin:泛型,反射和T和T之间的区别:任何

如果我尝试访问泛型类型的javaClass,则Kotlin编译器会抱怨T不是kotlin.Any的子类型 class Foo<T> (val t: T ){ val cls = t.javaClass // Error, T is not a subtype of kotlin.Any } 如果将T定义为子类型任何一切都可以。 class Bar<T:Any> (val t: T ){ val cls = t.javaClass // OK } Q1)如果输入“T”不是“任何”的子类型,哪个类/类可以是子类? Q2)对于T的所有实例是否存在一个javaClass,如果有,我该如何访问它?

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和泛型,使用泛型数组实现抽象泛型类

我有以下抽象类 abstract class Vec2t<T : Number>(open var x: T, open var y: T) 由…实施 data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float>(x, y) 到目前为止,一切正常 现在,我想为矩阵做类似的事情,这是我的抽象类 abstract class Mat2t<T : Number>(open var value: Array<out Vec2t<T>>) 应该由…来执行 class Mat2(override var value: Array<Vec2>) : Mat2t<Float>(value) 但编译器抱怨Array<Vec2> : 错误:(8,32)Kotlin:“值”的类型与在main.mat.Mat2t中定义的重写的var-property“public open var value:Array>”的类型不匹配 有人告诉我: 我不能改变一个var属性的类型,当我重写它(但实际上我没有真的改变它,我重写它与一个子类型..是同样的事情?) mat2.value […]

什么是有限通配符类型的Java注释字段的kotlin equivlant?

说我有这样的Java注释: public @interface Foo { Class<? extends Bar> value(); } public interface Bar {} 我应该如何将Foo翻译成kotlin? 在这种情况下,我只能切换回Java吗?

Kotlin泛型:实现MVP的接口

在下面的例子中,我明白BaseActivity不能作为presenter.onAttached的参数presenter.onAttached ,尽管它实现了与V类似的BaseView接口。实现的Presenter可能被提供了BaseView的一个子类,例如MainPresenter<MainView> ,这意味着BaseView不够具体。 abstract class BaseActivity<V : BaseView, out P : BasePresenter<V>> : AppCompatActivity(), BaseView { abstract val presenter : P override fun onCreate(savedInstanceState: Bundle?) { … presenter.onAttached(this) // Type mismatch } } 但是,我仍然需要通过参考实施活动来告诉演讲者其观点是什么。 理想情况下,我可以从Base类中完成所有这些工作,这样MVP实现细节对于实现类几乎是不可见的。 我已经找到了两种方法来做到这一点,但他们有他们的问题: 1.我可以让每个执行活动都覆盖一个V字段,但是每一个执行活动都会有相同的代码行! 锅炉多? 它似乎也不符合泛型的精神。 // base abstract val view : V override fun onCreate(savedInstanceState: Bundle?) { … presenter.onAttached(view) } // […]

这个错误是什么意思,当从java代码转换到通用的kotlin,单T后禁止?

试图将一些java代码转换为kotlin,并与泛型类型的问题。 这里的一个示例是Danny Preussler的Bundles和ViewModel的帖子的Java代码: 这里 class BundleAwareViewModelFactory<T extends ParcelableViewModel> implements ViewModelProvider.Factory { private final Bundle bundle; private final ViewModelProvider.Factory provider; public BundleAwareViewModelFactory(@Nullable Bundle bundle, ViewModelProvider.Factory provider) { this.bundle = bundle; this.provider = provider; } @SuppressWarnings("unchecked") @Override public T create(final Class modelClass) { T viewModel = (T) provider.create(modelClass); if (bundle != null) { viewModel.readFrom(bundle); } return viewModel; […]

如何从一个枚举类和kotlin中的一个字符串获取原始类型的枚举值

我在java中有以下代码: Enum getEnumValue(Class<?> enumClass, String value) { return Enum.valueOf((Class<Enum>) enumClass, value); } 如何在Kotlin中重写? 更新 enumValueOf<>()函数不适用于这种情况,因为我不知道实际的类型参数,我只有一个Class<?>具有未知类型的对象(kotlin中的Class<*> )和一个名称字符串。 该类被称为枚举: Class.isEnum返回true。 使用这两个输入,上面的java代码可以获得原始类型的枚举值。 这正是我所需要的,因为我对枚举的具体类型不感兴趣。 但我不知道如何在kotlin中得到相同的结果。

Kotlin继承

我目前正在学习把我的杂乱的代码分成DDD(注意,学习)范例。 实体( IEntity , IUser )是域层由接口组成,然后在数据层( BaseEntity , User )实现。 通过存储库模式访问数据。 但是当我为IUserRepository定义返回IUser ,在数据层,我必须手动将它返回给IUser以匹配返回签名。 我怎样才能避免铸造? 谢谢。 域图层 interface IEntity { var id: Long? var name: String? } interface IUser : IEntity { } interface IBaseRepository<T: IUser> { fun get(id: Long): Observable<T?> } interface IUserRepository : IBaseRepository<IUser> { } 数据层 abstract class BaseEntity() : IEntity { @SerializedName("id") […]