gpt4 book ai didi

scala -::在类签名中是什么意思?

转载 作者:行者123 更新时间:2023-12-03 19:06:57 26 4
gpt4 key购买 nike

我目前正在使用 ASM 并分析类的泛型签名。本节中记录的可能内容描述为 here并且可以用以下语法来概括:

类型签名: Z | C |乙|小号 |我 | F | Ĵ | D |字段类型签名

字段类型签名:类类型签名 | [ 类型签名 |类型变量

类类型签名: L Id (/Id ) TypeArgs? ( .Id TypeArgs? )* ;*

类型参数: < TypeArg+ >

类型参数: ** | ( + | - )?字段类型签名*

类型变量:标识号;

但是,我发现有一种情况并非如此:

trait SomeTrait
class SomeClass[T <: SomeTrait]
SomeClass 的泛型签名: <T::LSomeTrait;>Ljava/lang/Object;
我不明白为什么 ::出现在这里是什么意思。翻倍 :从语法的角度来看是无效的。有趣的是,如果我将替换 traitabstract class ::将替换为单个 : (预期的)。

有任何想法吗?

最佳答案

类文件规范说(在 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;>

总而言之,第一个冒号引入了类绑定(bind),第二个冒号引入了接口(interface)绑定(bind)。两个冒号放在一起的事实意味着没有类限制。

带有类和接口(interface)的签名:
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;
...

关于scala -::在类签名中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37239462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com