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
Types 为什么可以';如果Kotlin中的t类型参数为';s由另一个类型参数限定?_Types_Kotlin - Fatal编程技术网

Types 为什么可以';如果Kotlin中的t类型参数为';s由另一个类型参数限定?

Types 为什么可以';如果Kotlin中的t类型参数为';s由另一个类型参数限定?,types,kotlin,Types,Kotlin,下面是显示此问题的最低演示代码: interface A fun <T1, T2> test() where T2 : T1, T2 : A {} 接口A 有趣的测试(),其中T2:T1,T2:A{} 当我试图编译它时,编译器会抱怨: 错误:(81,25)Kotlin:如果类型参数由另一个类型参数限定,则它不能有任何其他界限 我阅读了,但只发现以下限制: 一个类型参数不能将自身指定为自己的绑定,而多个类型参数不能以循环方式将彼此指定为绑定 这并不能解释我遇到的限制 我浏览了Ko

下面是显示此问题的最低演示代码:

interface A

fun <T1, T2> test() where T2 : T1, T2 : A {}
接口A
有趣的测试(),其中T2:T1,T2:A{}
当我试图编译它时,编译器会抱怨:

错误:(81,25)Kotlin:如果类型参数由另一个类型参数限定,则它不能有任何其他界限

我阅读了,但只发现以下限制:

一个类型参数不能将自身指定为自己的绑定,而多个类型参数不能以循环方式将彼此指定为绑定

这并不能解释我遇到的限制

我浏览了Kotlin的问题跟踪程序,发现了有关此限制的问题:。但是,本期被拒绝的原因如下(2017年5月6日更新:本期已由Stanislav Erokhin重新发行):

我认为,如果我们取消这个限制,就无法将代码正确编译到JVM

安德烈·布雷斯拉夫

所以问题是:如果我们删除了这个限制,为什么我们不能将代码正确地编译到JVM

同样的演示也适用于Scala:

trait A

def test[T1, T2 <: T1 with A](): Unit = {}
trait A

def test[T1,T2之所以作出这种限制,是因为java(语言)有:

接口A{}
//错误:(7,26)java:类型变量后面不能跟其他边界
无效测试(){}
我们假设这在字节码级别也是禁止的。 我深入研究,似乎这是允许的,scalac生成了以下签名:

// signature <T1::LB;T2:TT1;:LA;>(TT1;TT2;)V
// descriptor: (LB;LB;)V
public <T1 extends B, T2 extends T1 & A> void test(T1, T2);
  // access flags 0x1
  // signature <T1:Ljava/lang/Object;T2:TT1;:LA;>()V
  // declaration: void test<T1, T2T1 extends A>()
  public test()V
//访问标志0x1
//签名()五
//声明:无效测试()
公共测试
因此,我们可能可以在kotlin的未来版本中支持这种情况

另外,据我所知,Kotlin有可判定的子类型,可判定性不受此影响

  interface A {}
  // Error:(7, 26) java: a type variable may not be followed by other bounds
  <T1, T2 extends T1 & A> void test() {} 
  // access flags 0x1
  // signature <T1:Ljava/lang/Object;T2:TT1;:LA;>()V
  // declaration: void test<T1, T2T1 extends A>()
  public test()V