Generics 让非泛型类在构造函数中接受泛型参数
我希望kotlin中有一个非泛型类,它在构造函数中使用泛型来指定参数。然而,我不知道如何做到这一点,用于Intellij的Java到Kotlin转换器中断了 我的java类如下所示Generics 让非泛型类在构造函数中接受泛型参数,generics,kotlin,Generics,Kotlin,我希望kotlin中有一个非泛型类,它在构造函数中使用泛型来指定参数。然而,我不知道如何做到这一点,用于Intellij的Java到Kotlin转换器中断了 我的java类如下所示 public class Test { interface I1 { } interface I2 { } private final I1 mI1; private final I2 mI2; public <T extends I1 & I
public class Test {
interface I1 { }
interface I2 { }
private final I1 mI1;
private final I2 mI2;
public <T extends I1 & I2> Test(T host) {
mI1 = host;
mI2 = host;
}
}
我之所以愿意这样做,是因为在Android开发中,能够指定一个类似于Kotlin的构造函数参数是很有用的,现在看来这是不可能的。对于主构造函数,类型参数表示类类型参数:
对于二级构造函数,没有可能的类型参数:
然而,构造函数只是一个特殊的函数。如果我们不使用构造函数,而是使用我们自己的函数,我们可以得出以下结论:
class Test {
interface I1
interface I2
private val mI1: I1
private val mI2: I2
internal constructor(host: I1, host2: I2) {
mI1 = host
mI2 = host2
}
companion object {
fun <T> create(host: T): Test where T : Test.I1, T : Test.I2 {
return Test(host, host)
}
}
}
fun <T> test(host: T): Test where T : Test.I1, T : Test.I2 {
return Test(host, host)
}
类测试{
接口I1
接口I2
私有val mI1:I1
私有val mI2:I2
内部构造函数(主机:I1,主机2:I2){
mI1=主机
mI2=host2
}
伴星{
乐趣创建(主机:T):测试,其中T:Test.I1,T:Test.I2{
返回测试(主机,主机)
}
}
}
趣味测试(主机:T):测试,其中T:test.I1,T:test.I2{
返回测试(主机,主机)
}
我们现在可以调用Test.create(host)
或Test(host)
来创建一个实例。扩展可以用来使Test
实现调用操作符的
类测试{
接口I1
接口I2
私有val mI1:I1
私有val mI2:I2
私有构造函数(i1:i1,i2:i2){
mI1=i1
mI2=i2
}
伴星{
操作符乐趣调用(主机:T):测试其中T:I1,T:I2{
返回测试(主机,主机)
}
}
}
然后,您可以使用所需的调用语法创建一个Test
对象:
Test(对象:Test.I1,Test.I2{})
这种方法的问题在于,从Java或其他JVM语言的角度来看,它不是一个真正的构造函数(如果这很重要的话),对于那些找到函数的人来说,名字会很奇怪(@JvmStatic会有帮助)。反射也不会将其视为构造函数(同样,也可能不重要)。这称为“工厂”。最好用一句话来解释伴奏对象。还有@JvmStatic注释,如果他们想像调用静态类一样调用工厂,那么在这里可能很好。
class (used by memberDeclaration, declaration, toplevelObject)
: modifiers ("class" | "interface") SimpleName
typeParameters?
primaryConstructor?
(":" annotations delegationSpecifier{","})?
typeConstraints
(classBody? | enumClassBody)
;
secondaryConstructor (used by memberDeclaration)
: modifiers "constructor" valueParameters (":" constructorDelegationCall)? block
;
class Test {
interface I1
interface I2
private val mI1: I1
private val mI2: I2
internal constructor(host: I1, host2: I2) {
mI1 = host
mI2 = host2
}
companion object {
fun <T> create(host: T): Test where T : Test.I1, T : Test.I2 {
return Test(host, host)
}
}
}
fun <T> test(host: T): Test where T : Test.I1, T : Test.I2 {
return Test(host, host)
}