Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 让非泛型类在构造函数中接受泛型参数_Generics_Kotlin - Fatal编程技术网

Generics 让非泛型类在构造函数中接受泛型参数

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

我希望kotlin中有一个非泛型类,它在构造函数中使用泛型来指定参数。然而,我不知道如何做到这一点,用于Intellij的Java到Kotlin转换器中断了

我的java类如下所示

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)
}