Tag: 仿制药

在Multibinder中使用泛型

在使用com.google.inject.multibindings.Multibinder时,我对泛型有点困惑: interface MessageParser<S, T> { fun accept(msg: S): Boolean fun parser(msg: S): T } class Parser1 : MessageParser<Mime, Parsed> class Parser2 : MessageParser<Mime, Parsed> class EmailModule : AbstractModule() { override fun configure() { val parsers = Multibinder.newSetBinder(binder(), MessageParser::class.java) parsers.addBinding().to(Parser1::class.java) parsers.addBinding().to(Parser2::class.java) } } 这工作,但失去了所有的仿制药信息。 是否有可能限制这个解析器的特定子集,即做 val parsers: MessageParser<Mime, Parsed> = Multibinder.newSetBinder(binder(), MessageParser<Mime, Parsed>::class.java) 现在,这会产生一个编译器错误: 只有类允许在类文字的左侧

如何在类的构造函数中调用泛型类的构造函数

我想创建具有以下属性的类Matrix2D : 类应该是通用的 应该能够接受尽可能多的类型(理想情况下全部) “默认”构造函数应该初始化所有的单元格与默认的类型值 正确处理大小写的时候,类型没有默认构造函数(可能是默认参数解决了这个) 我怎么能做到这一点? 这是我的素描: class Matrix2D<T> : Cloneable, Iterable<T> { private val array: Array<Array<T>> // Call default T() constructor if it exists // Have ability to pass another default value of type constructor(rows: Int, columns: Int, default: T = T()) { when { rows < 1 -> throw MatrixDimensionException("Number of rows […]

如何指定一个类型参数我不知道

我已经将我的问题减少到了下面的最小范例: interface Property<T : Comparable<T>> fun <T : Comparable<T>> parsePropertyValue(property: Property<T>, value: String): T = TODO() fun test() { val property: Property<*> = TODO() val value = parsePropertyValue(property, "test") } 对parsePropertyValue的调用不会编译,并显示错误消息“无法推断类型参数T”。 等效的Java代码编译没有问题: interface JavaProperty<T extends Comparable<T>> { } class Test { public static void main(String[] args) { JavaProperty<?> property = null; Comparable<?> value = parsePropertyValue(property, […]

Kotlin,Number的通用操作

我有以下 abstract interface Vec2t<T : Number> { var x: T var y: T } data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float> 我有一个界面,我定义了几个操作,例如: interface fun_vector2_common { fun abs(res: Vec2, a: Vec2): Vec2 { res.x = glm.abs(ax) res.y = glm.abs(ay) return res } } 使用泛型可以实现,比如abs吗? interface fun_vector2_common<T : Number> { fun abs(res: […]

Kotlin通用范围为Class

以下泛型不能编译。 这里的语义错误是什么? 函数调用 start(MainActivity.javaClass) // <== Doesn't compile 方法定义 // Definition public fun <T : Activity> start(activityClass: Class<T>) { startActivity(Intent(this, activityClass)) } 编译器错误 Error:(43, 9) Type parameter bound for T in fun <T : android.app.Activity> start(activityClass: java.lang.Class<T>): kotlin.Unit is not satisfied: inferred type com.mobsandgeeks.hellokotlin.MainActivity. <class-object-for-MainActivity> is not a subtype of android.app.Activity

为什么我不能获得泛型参数的类?

我有一个函数,它采用泛型类型的一个参数,我想访问它的类: fun <T> test(t: T) { t::class } 这失败了,“类中的表达式具有可空类型”。 没关系,我明白了(我可以使用Any?作为我的T和null作为值)。 但是,如果我改变它来保证t不是null,它仍然会失败,同样的错误信息: fun <T> test(t: T) { t!!::class } 在这种情况下, t!!::class还是会造成麻烦? 有没有办法让班级不使用任何(或铸造任何)?

具有泛型返回类型的函数

是否有可能返回一个泛型类型的函数? 就像是: fun <T> doSomething() : T { when { T is Boolean -> somethingThatReturnsBoolean() T is Int -> somethingThatReturnsInt() else -> throw Exception("Unhandled return type") } }

为什么使用声明 – 站点差异

这不是一个Kotlin的具体问题,但我想更好地理解为什么我会使用声明站点方差(协变和逆变)。 我知道如何使用它们,我只是没有看到太多的好处,或者在哪种情况下,我应该选择一个优先于另一个,为什么我不想一直使用Use-site方差。

kotlin:通用于不同的类型

我需要这样的线性函数: class Linear(val a : Double, val b : Double) { fun eval(in : Double) { return a*in + b } } 然后,我需要为矢量相同的东西。 class Vector3d(val a1 : Double, val a2 : Double, val a3 : Double) { // use operator overloading https://kotlinlang.org/docs/reference/operator-overloading.html to make +, -, /, *, etc. possible for vectors } class Linear(val […]

为什么泛型代数数据类型在成员类型上需要`T`?

我想定义一个通用代数数据类型,用于像我这样的parse函数: sealed class Result<T> { class Success(val value: T, val pos: Int) : Result<T>() class Failure(val message: String, val pos: Int) : Result<T>() } fun <T> parse(t: Parser<T>, input: String, initialPos: Int = 0, collectErrors: Boolean = true) : Result<T> { 然而这是不允许的,因为T是未定义的参考。 如果我将T添加到所有成员类型中, sealed class Result<T> { class Success<T>(val value: T, val pos: Int) : […]