Tag: 泛型

你能解释一下这段代码的C#代码?

从Kotlin文档页面: // public final class Gson { // … // public <T> T fromJson(JsonElement json, // Class<T> classOfT) // throws JsonSyntaxException { // … 在上面的代码片断中,我了解除Class<T>之外的所有内容。 我认为这是C#相当于以下内容: public sealed class Gson { public T FromJson<T>(JsonElement json, System.Type Type) { } } 客户端代码会这样说: var gson = new Gson(); var customer = gson.FromJson<Customer>(json, typeof(Customer)); 但我不能确定,因为整个System.Type参数在方法定义中的泛型类型参数T面前似乎是多余的。 另外,在该页面上的相同位置,在下面的代码段中, class.java是什么? inline […]

如何将一个集合的内容添加到新的集合

我试图覆盖调用超类的方法,并将返回的值添加到一个新的集合(这是必需的,因为超类的返回值是不可变的)。 这个习惯性的Java如下所示: public class JaxrsApplication extends Application { @Override public Set<Class<?>> getClasses() { HashSet<Class<?>> classes = new HashSet<>(super.getClasses()); classes.add(PlainTextWriter.class); classes.add(PageResource.class); return classes; } } 我试图在Kotlin中实现一个相当于没有成功的方法: public class JaxrsApplication() : Application() { override fun getClasses(): MutableSet<Class<out Any?>>? { val classes = hashSetOf<Class<out Any?>>() classes.addAll(super.getClasses()) // <= compiler error! classes.add(javaClass<PlainTextWriter>()) classes.add(javaClass<PageResource>()) return classes } } 这似乎是对addAll函数的类型推断问题,但我不知道如何解决它。 帮助赞赏:-) […]

可空类型的层次结构中的地方是什么?

你可以从类型B继承类型A ,但是每当你定义类型A你将得到类型A? (可空)免费。 但是它究竟在哪里呢? A? 从A还是其他方式继承? 我问这个是因为我对这样的代码感到困惑: open class Foo { fun foo() : Int { return 0; } } fun test<T : Foo?>(x:T) : Int { return x.foo() // (@) } fun main(args: Array<String>) { println(test<Foo?>(null)) } 我不明白为什么行(@)编译? 或换句话说,我不明白可空的类型层次,因为直到现在我虽然T为Foo? 或从它派生的任何类型。 你可以从可为空的类型中获得不可空的类型,那么它会是什么意思? 对不起,如果这是明显的,我只是在学习Kotlin。 (@)为可空类型,它应该是x!!.foo() 。

Kotlin反射+泛型

编辑1:改变标题,我的坏。 我有一个界面事件 : interface Event 还有一些实现它的类,比如CustomEvent : class CustomEvent : Event { … } 我一直在尝试做的是:给定一个有事件作为参数的方法(所以,任何实现Event接口的类),像这样 fun onCustomEvent(event: CustomEvent) { … } ,我想将该事件添加到列表中。 因此,这个清单最终将会持有一堆不同的事件。 在Java中,我相信它会是这样的(可能不是100%准确的): List<Class<? extends Event>> eventsList; …. Class<?> param = methodThatHasSomeEventAsParam.parameterTypes[0]; if (Event.class.isAssignableFrom(param)) { Class<? extends Event> actualParam = (Class<? extends Event>) param; eventsList.add(actualParam); // Adds CustomEvent to the events list. } 但至于Kotlin,我真的不知道如何正确使用泛型,具体是什么将是正确的翻译方式 […]

二维通用数组提供者

我试图在Kotlin中实现通用的二维数组提供程序: public fun <T> array2dim(sizeOuter: Int, sizeInner: Int): Array<Array<T>> = Array(sizeOuter) { Array(sizeInner) } 但无法弄清楚如何解决这个问题。 编译器说: 类型接口失败:没有足够的信息来推断构造函数中的参数T Array(size:Int,init:(Int)→T)请明确指定。

访问外部类型的类型参数

在Kotlin中,我们可以定义嵌套的接口。 如果外部接口是通用的(这里只是为了模拟一个适当的Self元类型,但可以想象其他用途),我可以从内部类型引用它的类型参数吗? 也就是说,我想达到(相当于)这个: interface JsonRepresentable<Self: JsonRepresentable<Self>> { fun toJson(): String interface Companion { operator fun invoke(json:String): Self? } }

编写一个比Java更优雅的可复制接口

我试图编写一个接口,类可以实现,使他们“可复制”,(类型)安全Clonable。 在Java中,我会使用递归泛型来做这样的事情: public interface Copyable<C extends Copyable<C>> { C copy(); } public class Example implements Copyable<Example> { … @Override public Example copy() { return new Example(this); //invoke copy constructor } } 显然这不是那么优雅,可Copyable和Example的标题看起来过于复杂。 有没有更好的方式来实现这个Kotlin?

Kotlin – 检查通用参数是否可选?

我正在写这个通用的方法来从Firebase中获取数据? 在某些情况下返回空有效,在其他情况下是不是有可能检查泛型参数是否可以为空? 前 reference.obsrveObject(User.class) 应该抛出如果null reference.obsrveObject(User?.class) 应该用空值调用onNext fun DatabaseReference.observeSingleEvent(): Observable<DataSnapshot?> { return Observable.create { subscriber -> val valueEventListener = object: ValueEventListener { override fun onDataChange(snapshot: DataSnapshot?) { subscriber.onNext(snapshot) subscriber.onCompleted() } override fun onCancelled(error: DatabaseError?) { subscriber.onError(FirebaseDatabaseThrowable(error)) } } addListenerForSingleValueEvent(valueEventListener) } } fun <T>DatabaseReference.obsrveObject(clazz: Class<T>): Observable<T> { return observeSingleEvent().map { snapshot -> if (snapshot != null) […]

Kotlin:是否有可能有一个恒定的属性依赖于实现泛型?

我有以下abstrac基类 abstract class Vec2t<T : Number>(open var x: T, open var y: T) { companion object { val SIZE = 2 * when (/** T instance type */) { is Byte, is Ubyte -> 1 is Short, is Ushort -> 2 is Int, is Uint, is Float -> 4 is Long, is Ulong, is Double […]

Android:如何为Kotlin中的所有对象列表创建类型转换器(for Room)

我在我的项目中使用Room作为本地数据库解决方案。 对于某个对象类型的每个列表,我已经添加了类型转换器到项目中,所以类型转换器看起来像这样: @TypeConverter fun convertListToString(video: List<VideoType>): String { val videoArray = arrayOfNulls<VideoType>(video.size) for (i in 0..video.size – 1) { videoArray[i] = video[i] } var str = "" val gson = Gson() for (i in videoArray.indices) { val jsonString = gson.toJson(videoArray[i]) str = str + jsonString if (i < videoArray.size – 1) { str = str […]