Generics kotlin泛型和运算符重载

Generics kotlin泛型和运算符重载,generics,kotlin,operator-overloading,Generics,Kotlin,Operator Overloading,我想做这样的事情 data class TestGen<T: Number>(var x : T, var y : T) public operator<T:Number> fun Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y) public operator fun Int.plus(p:TestGen<Float>) = TestGen(this+p.x,p.y) public operator

我想做这样的事情

data class TestGen<T: Number>(var x : T, var y : T)

public operator<T:Number> fun Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y)
public operator fun Int.plus(p:TestGen<Float>) = TestGen(this+p.x,p.y)
public operator fun Int.plus(p:TestGen<Double>) = TestGen(this+p.x,p.y)
数据类TestGen(变量x:T,变量y:T)
公共运营商fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)
那我怎么做呢?或者有没有其他想法来做同样的事情? 因为我想做这样的事情

data class TestGen<T: Number>(var x : T, var y : T)

public operator<T:Number> fun Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y)
public operator fun Int.plus(p:TestGen<Float>) = TestGen(this+p.x,p.y)
public operator fun Int.plus(p:TestGen<Double>) = TestGen(this+p.x,p.y)
public operator fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)
公共运营商fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)

首先,在声明扩展函数时出现语法错误。其次,
数字
不会自动定义加另一个数字的能力。因此,使用
Number
作为泛型基类型会产生问题。不幸的是,您需要创建所有您希望对所有数字类型有效的排列

分解它

operator <T: Number> fun Int.plus(p:TestGen<T>) = TestGen(this+p.x,p.y)
因此,要解决此问题,您真正需要的是删除函数的泛型参数,并具体说明您支持的每种类型:

@JvmName("IntPlusTestGenWithInt")
operator  fun Int.plus(p:TestGen<Int>) = TestGen(this+p.x,p.y)
@JvmName("IntPlusTestGenWithLong")
operator  fun Int.plus(p:TestGen<Long>) = TestGen(this+p.x,p.y)
@JvmName("IntPlusTestGenWithDouble")
operator  fun Int.plus(p:TestGen<Double>) = TestGen(this+p.x,p.y)
@JvmName("IntPlusTestGenWithFloat")
operator  fun Int.plus(p:TestGen<Float>) = TestGen(this+p.x,p.y)
// etc
@JvmName(“IntPlusTestGenWithInt”)
运算符fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)
@JvmName(“IntPlusTestGenWithLong”)
运算符fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)
@JvmName(“IntPlusTestGenWithDouble”)
运算符fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)
@JvmName(“IntPlusTestGenWithFloat”)
运算符fun Int.plus(p:TestGen)=TestGen(this+p.x,p.y)
//等
需要使用
JvmName
注释,因为您创建的扩展方法仅与JVM擦除的泛型参数不同。因此,在内部,Kotlin生成的字节码必须按名称区分每个扩展方法,即使从Kotlin代码中看不到


对于从和添加到的所有类型,都需要类似的函数变体。你应该考虑你正在处理的那些没有意义的部分,例如,<代码>小数部分的双< /代码>添加到<代码> INT/COM>。

@ MrHHMED,如果它工作正常,请接受答案,向可能阅读此信息的其他人发信号。