scala – 在类签名中意味着什么?
我目前正在玩ASM并分析类的泛型签名.本节中记录的可能内容描述为
here,可以使用以下语法进行汇总:
TypeSignature:Z | C | B | S |我| F | J | D | FieldTypeSignature FieldTypeSignature:ClassTypeSignature | [TypeSignature | TypeVar ClassTypeSignature:L Id(/ Id)TypeArgs? (.Id TypeArgs?)*; * TypeArgs:< TypeArg> TypeArg:** | (| – )? FieldTypeSignature * TypeVar:T Id; 但是,我发现一个案例并非如此: trait SomeTrait class SomeClass[T <: SomeTrait] SomeClass的泛型签名:< T :: LSomeTrait;> Ljava / lang / Object; 我不明白为什么::出现在这里,它是什么意思. Doubled:从语法的角度来看是无效的.有趣的是,如果我用抽象类替换trait,::将被替换为单个:(预期的是什么). 有任何想法吗? 解决方法
类文件规范说(在第
4.7.9.1. Signatures节):
ReferenceTypeSignature: ClassTypeSignature TypeVariableSignature ArrayTypeSignature TypeParameters: < TypeParameter {TypeParameter} > TypeParameter: Identifier ClassBound {InterfaceBound} ClassBound: : [ReferenceTypeSignature] InterfaceBound: : ReferenceTypeSignature 将此应用于< T :: LSomeTrait;>手段: TypeParameters => < TypeParameter {TypeParameter} > => < Identifier ClassBound {InterfaceBound} {TypeParameter} > => < T ClassBound {InterfaceBound} {TypeParameter} > => < T : [ReferenceTypeSignature] {InterfaceBound} {TypeParameter} > => < T : {InterfaceBound} {TypeParameter} > => < T : : ReferenceTypeSignature {TypeParameter} > => < T : : LSomeTrait; {TypeParameter} > => < T : : LSomeTrait; > => <T::LSomeTrait;> 总而言之,第一个冒号引入了类绑定,第二个冒号引入了接口绑定.两个冒号保持在一起的事实意味着没有阶级约束. 使用类和接口签名: scala> trait T defined trait T scala> abstract class A defined class A scala> class C[X <: A with T] defined class C scala> :javap C Size 554 bytes MD5 checksum 6273d85df5987e350e7112726756a55f Compiled from "<console>" public class C<X extends A & T> extends java.lang.Object minor version: 0 major version: 50 flags: ACC_PUBLIC,ACC_SUPER Constant pool: #1 = Utf8 C #2 = Class #1 // C #3 = Utf8 <X:LA;:LT;>Ljava/lang/Object; ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |