Tag: 泛型

Java通配符类型与Kotlin Star-projection

我正在阅读关于Java和Koltin之间差异的kotlin文档,在这里https://kotlinlang.org/docs/reference/comparison-to-java.html 。 有人指出, Koltin没有通配符类型 。 但仔细阅读泛型文档后,我发现了有关星形投影的信息 ,老实说,我看不出有什么不同。 有人可以向我解释这是怎么回事 List<?> list; 不同于此 lateinit var list: MutableList<*>

Kotlin通用铸造到一个更具体的子类

所以我试图搞砸Kotlin,我有一个老的java MVP框架,在java中我们不得不将一个通用的接口转换为一个更具体的接口,比如public <P extends BaseContract.Presenter> P getPresenter() 我们将在一个子类中作为 @Override public AdvertisementContract.Presenter getPresenter() { return (AdvertisementContract.Presenter)super.getPresenter(); } 在Kotlin我要这样做: override fun getPresenter(): AdvertisementContract.Presenter { return super.getPresenter() as AdvertisementContract.Presenter } 有没有什么我可以做,而不需要在基础界面中修改泛型?

Kotlin实体类型参数不智能投射

我正在试验设置未初始化的值,并试图让以下工作。 这主要是对物化仿制的权力(和限制)的好奇心。 我试图为数据类的可选参数提供默认值。 inline fun <reified T> uninitialized(): T = when (T::class) { Long::class -> -1L // Type mismatch. Required: T Found: Long String::class -> "" // Type mismatch. Required: T Found: String // and so on… else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class) } data class Thing( var id: Long […]

与Kotlin泛型混淆

我是Kotlin的新手,我正在尝试编写一些相当简单的代码,但我无法弄清楚如何使用泛型来实现它。 我有一个Handler特点,代表事物的处理程序。 我不能更改处理程序的代码,因为它来自库 。 trait Handler<T> { fun handle(result: T) } 下面的所有代码都在我的控制之下 – User是具有诸如AdminUser和GuestUser等子类的公开类。 一个名为AdminUserAction的特性可以创建一个AdminUser列表,然后将列表传递给List<AdminUser>一个处理器。 trait AdminUserAction { fun then(handler: Handler<List<AdminUser>>) } 现在我想为AdminUserAction传递一个AdminUserAction处理程序,而不是AdminUser 。 假设处理程序只记录用户的名字,并且不对管理员指定的属性做任何事情。 fun doIt(action: AdminUserAction, printAllNames: Handler<List<User>>) { action.then(printAllNames) } 但是,这段代码给了我一个TypeMismatch 。 由于处理程序的类型是List<T>并且是不可变的,所以前面的代码应该是完全安全的,但编译器无法解决这个问题。 如果我可以访问处理程序的代码,我可以做到以下几点,它会工作 – trait Handler<in T> { fun handle(result: T) } 但是,正如我之前所说,我不能修改Handler,因为它来自一个库。 此外,似乎很难做到这一点,因为处理程序的类型是完全一般的,应该也可以用于其他类型的处理程序。 我试过继承Handler并使用它 – trait ListHandler<in T>: Handler<List<T>> { […]

Kotlin中的Java泛型:在Kotlin中使用Java raw类型作为方法参数

我正在Facebook的SDK中看这个类: public final class ShareDialog extends FacebookDialogBase<ShareContent, Sharer.Result> 我想在Kotlin中有一个方法接受它的父类,类似于以下内容: fun shareToFacebook(shareDialog: FacebookDialogBase<ShareContent<*, *>, Sharer.Result>, activity: Activity) 但是当我尝试调用它的形式java: tournamentPresenter.shareToFacebook(new ShareDialog(this), this); 我得到编译时错误: Error:(751, 45) error: incompatible types: ShareDialog cannot be converted to FacebookDialogBase<ShareContent<?,?>,Result> PS我知道最好不要给主持人分享对话,我不打算这样做,我们只是用它作为问题的一个例子

Kotlin – 具有泛型返回类型的抽象函数

我是Kotlin的新手,真的很担心我是否写出了正确的语法。 我有一个超类,我想写一个通用的抽象函数如下。 abstract class A { abstract fun <T> getText() : Test<T> } class B : A() { override fun <T> getText(): Test<T> { return Test1() // Error – Required Test<T>, found Test1 } } class C : A() { override fun <T> getText(): Test<T> { return Test2() // Error – Required Test<T>, found Test2 […]

Java和Kotlin使用泛型进行铸造。 丢失类型安全

当在Kotlin / Java中编码时,我偶然发现了使用投射和泛型的东西。 似乎有可能让类型系统相信列表的类型是List<Foo> ,而它实际上是一个List<Object> 。 任何人都可以向我解释为什么这是可能的? 以下是Kotlin和Java中的一个例子: 在Kotlin的例子 fun <T> test(obj: Any): List<T> { val ts = ArrayList<T>() ts.add(obj as T) return ts } fun <T> test2(obj: Any): T { return obj as T } fun <T> test3(obj: Any): List<T> { val ts = ArrayList<T>() ts.add(test2(obj)) return ts } fun main(args: Array<String>) { val […]

Kotlin和通用构造函数让我感到困惑

不了解Kotlin结合泛型。 我试图把我的一些java移向kotlin。 这些类中的几个是spring-data存储库和一个通用服务,它们将一个类型的存储库作为通用参数,例如: @Transactional interface ForumRepository : CrudRepository<Forum, Long> { fun findByName(name: String): Forum? } 那么GenericKotlinService: abstract class GenericKotlinService<T>(val repository: CrudRepository<Any, Serializable>) { fun <T> findOne(id: Serializable): T { return repository.findOne(id) as T } fun delete(id: Any) { repository.delete(id) } } 但是,现在当我尝试创建一个使用这个通用服务与特定的crudRepository的服务时,我总是得到错误,例如 class ForumService @Autowired constructor(repository: ForumRepository) : GenericKotlinService<Forum>(repository) { open fun findByName(name: String) = […]

Kotlin的泛型与扩展

我试图将Java项目移植到kotlin,并有一些问题。 我在Java中使用泛型有一些MVP结构 interface View<P extends Presenter> {} interface Presenter<V extends View> {} interface BaseView<P extends Presenter> extends View<P> {} class BaseActivity<P extends Presenter> extends AppCompatActivity implements BaseView<P> {} 最初两个类,我从IDE错误 interface Presenter<V : View<*>> {} interface View<P : Presenter<*>> {} 我的错误是 *this type parameter violates the finite bound restriction* Java代码没有任何问题

Kotlin NDArray与一个带有泛型返回类型的lambda构造函数

我正在尝试在Kotlin中创建一个非常简单的通用NDArray类,它将lambda表达式作为init函数。 class NDArray<T>(i: Int, j: Int, f: (Int) -> T) { val values: Array<T> = Array(i * j, f) } 典型的用法是: fun main(args: Array<String>){ val m = NDArray(4, 4, ::zero) } fun zero(i: Int) = 0.0 我的问题是,Kotlin编译器抱怨在构造函数中初始化值 values = Array(i * j, f) 通过说“不能使用'T'作为通用类型参数。 为什么? 编辑: 如果我用我自己的MyArray替换Kotlin数组实现,它会编译: class NDArray<T>(i: Int, j: Int, f: (Int) -> […]