加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在类签名中意味着什么?

发布时间:2020-12-16 10:00:52 所属栏目:安全 来源:网络整理
导读:我目前正在玩ASM并分析类的泛型签名.本节中记录的可能内容描述为 here,可以使用以下语法进行汇总: TypeSignature:Z | C | B | S |我| F | J | D | FieldTypeSignature FieldTypeSignature:ClassTypeSignature | [TypeSignature | TypeVar ClassTypeSignat
我目前正在玩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;
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读