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