Tag: 泛型

Kotlin数组类型和类文字

我想用GSON反序列化JSON对象的数组。 所以简单的电话: val arrayOfFoo = gson.fromJson(source, Array<Foo<*>>::class.java>) 应该做的伎俩。 但是类型擦除告诉我们,Foo <*>在运行时不存在,所以弹出一个错误“只有类文字被允许在类文字的左边”。 那么,解决方案必须是: val arrayOfFoo = gson.fromJson<Array<Foo<*>>>(source, Array::class.java) 不幸的是,现在的Kotlin编译器魔术 – 将Wrapper类型的数组转换为原始数组 – 不知道该怎么做,并告诉我们:“数组类需要类类型,请在尖括号中指定一个类型”。 但是,等一下:这是,第二个之前什么都不行。 运用 Array<Foo>::class.java 也不起作用,因为现在编译器告诉我们:“Foo预计会有一个类型的参数”。 我个人看不出有办法解决这个问题。 是不可能给一个类型的数组的类型,它的类型也需要一个类型参数?

Kotlin泛型继承 – 类型不匹配

我正在尝试为领域对象构建一组提供程序。 这是我试图构建的一个示例结构: 接口: interface IDataProvider<out T : RealmObject> { fun getRealmObject(): T } 具有类型化提供者实例化的伴随功能的基本提供者类: open abstract class BaseProvider<out T : RealmObject> constructor(protected val context: Context?) : IDataProvider<T> { companion object { fun <T : RealmObject, E : BaseProvider<T>> create(context: Context?): E { if (something) { return SomeChildProviderProvider(context) } else { throw TypeNotSupportedException() } } } […]

在Kotlin中实例化一个使用递归泛型的具体Java类

我可以在Kotlin中实例化一个使用递归泛型的具体Java类吗? 细节 我想实例化一个Java类,使用递归泛型类似于下面的例子。 我找到了一个将Java类封装在一个新类中的工作,但是这感觉就像是我回避了一个我应该能够直接处理的问题。 具有递归泛型的Java类 public class MyLegacyClass<T extends MyLegacyClass<T>> { // implementation … } 它是如何在Java中实例化的 // In Java we just ignore the generic type… MyLegacyClass myLegacyClass = new MyLegacyClass(); 失败尝试在Kotlin中实例化 class myClass { // Error: One type argument expected for class… val x: MyLegacyClass = MyLegacyClass() // Still 'Error: One type argument expected for […]

在Kotlin中泛型的子类型问题

我在我的代码中有以下继承模式。 trait A { fun foo(): Set<A> } trait B : A { override fun foo(): MutableSet<B> } trait C : A { override fun foo(): Set<C> } trait D : C, B { override fun foo(): MutableSet<D> } 当B和D返回集合时,编译器能够确定Set<D>是Set<B>和Set<C>的子类型。 但是,当我将B.foo和D.foo的返回类型更改为MutableSet ,编译器能够验证B.foo的返回类型,但是我得到一个错误,报告D.foo的返回类型不是子类型的MutableSet<B> 。 为什么科特林无法推断这种形式的亚型,有没有工作,而没有检修我的等级?

我有两个Kotlin扩展方法为同一类,但具有不同的通用签名和编译器抱怨

我正在为同一个类写两个扩展函数: class Something<T:Any> { … } 他们看着像是: fun Something<Int>.toJson(): String = … fun Something<Double>.toJson(): String = … 并导致编译器错误: Kotlin:平台声明冲突:以下声明具有相同的JVM签名 如何创建两个只有泛型签名不同的扩展函数? 或者是不可能的? 注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Kotlin主题的答案是在SO中。 它起源于Kotlin松懈的 #通道。

Kotlin泛型自定义使用通配符的类型

所以在Java中我可以做到以下几点,定义一个具有超类和接口约束的类型。 public class Main<ControllerType extends Node & Controller> { private ControllerType controller; private ControllerType controller2; private Main(ControllerType controller, ControllerType controller2) { this.controller = controller; this.controller2 = controller2; } public static void main(String[] args) { Main<?> main = new Main<>(new Home(), new Parent()); } } 但是在Kotlin这是不可能的。 class Main<ControllerType>(val controller: ControllerType, val controller2: ControllerType) where ControllerType : […]

在Kotlin函数类型中表示“超级”泛型?

我试图移植一个RxJava库,并利用Kotlin的扩展功能。 fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), condition: (R,T) -> Boolean) = compose(Transformers.collectWhile(factory,condition)) Transformers.collectWhile()是用Java编写的,具有以下签名: public static <T, R extends Collection<T>> Transformer<T, R> collectWhile(final Func0<R> factory, final Action2<? super R, ? super T> collect) 但是,我正在collect关于collect参数的映射问题,而且我不擅长泛型。 我如何用功能类型来表达super ? UPDATE 我愚蠢的错误。 我不应该在深夜发帖。 我其实是针对这个 public static <T, R extends Iterable<?>> Transformer<T, R> collectWhile(final Func0<R> factory, final Action2<? super […]

Kotlin:泛型函数作为返回类型?

在Kotlin中,是否可以声明一个泛型函数类型作为函数的返回类型? 我想要在Java中看起来像这样: interface Factory { static Factory INSTANCE = new FactoryImpl(); <T> T create(String name, Class<T> type); } class PrefixedFactory implements Factory { private final String prefix; PrefixedFactory(String prefix) { this.prefix = prefix; } @Override public <T> T create(String name, Class<T> type) { return Factory.INSTANCE.create(prefix + name, type); } } (请注意,在本例中,我使用静态字段访问Factory实例,以避免将泛型函数作为参数传递,这会在Kotlin中显示自己的问题)。 我想将前缀转换为kotlin函数,但似乎不可能将泛型函数声明为返回类型: fun prefixer(prefix: String): […]

Lambda在Kotlin中使用通配符

我正在看谷歌提供的例子,并遇到这条线 private final ArrayMap<Class, Callable<? extends ViewModel>> creators; 我有困难搞清楚如何转换Callable<? extends ViewModel> Callable<? extends ViewModel>为Kotlin中的lambda 我怎么去做这个? 编辑: class ViewModelFactory(appComponent: AppComponent) : ViewModelProvider.Factory { private val creators: ArrayMap<Class<*>, () -> ViewModel> = ArrayMap() init { creators.put(DashboardViewModel::class.java, { appComponent.getDashboardViewModel() }) } override fun <T : ViewModel?> create(modelClass: Class<T>?): T = creators[modelClass]?.invoke() as T } 在上面的代码中,我在我的IDE中得到了一个未经检查的转换lint消息。 有没有办法避免这种情况?

在kotlin中覆盖泛型的功能

例如,我有以下示例代码 fun f<T>( cb: (T, Int) -> Unit ): Unit { println("f called with cb which accepts 2 arguments"); } fun f<T>( cb: (T) -> Unit ): Unit { println("f called with cb which accepts 1 argument"); f<T> {item, position -> cb(item) } } fun main(args : Array<String>) { f { item -> } f […]