を必要とする、ClassSignatureフォームJVM仕様:一般的な署名のための文法は、一般的な署名のための仕様では先読み
ClassSignature:
[TypeParameters] SuperclassSignature {SuperinterfaceSignature}
TypeParameters:
< TypeParameter {TypeParameter} >
TypeParameter:
Identifier ClassBound {InterfaceBound}
ClassBound:
: [ReferenceTypeSignature]
InterfaceBound:
: ReferenceTypeSignature
そこでタイプパラメータの結合スーパークラス(一部examples here)を省略することができました。
クラスの宣言がpublic class A<T, LFooBar>
の場合、Javaコンパイラは<T:Ljava/lang/Object;LFooBar:Ljava/lang/Object;>Ljava/lang/Object;
の署名を生成します。
IUCでは、クラスバインディングを省略することができます。この場合、署名は<T:LFooBar:>Ljava/lang/Object;
になります。短い署名がT:LFooBar:
は、2つの型パラメータであることを知っている、とFooBar
バインドされたクラスでない1型パラメータT
するために、第2 :
を見据え必要であることを解析
。
実際には、クラスバインドを離れることは、インターフェイスがバインドされている場合にのみ行われますか? public class A<T extends Comparable<? super T>>
の場合、javacは署名<T::Ljava/lang/Comparable<-TT;>;>Ljava/lang/Object;
を生成します。しかし、私はこの仮定に頼ることができないと思う。
私は何かを誤解しましたか?
ありがとう、私はやっていることを先読みしている必要があります。あなたは "識別子は>で始まることに注意してください"と言います - あなたは参照を提供できますか?仕様には「文法には終端記号識別子[...]が含まれています。このような名前にはASCII文字は使用できません。 /se8/html/jvms-4.html#jvms-4.7.9.1) –
JVMはGenericsを気にしないので、JVMはそれをまったく実装しません。 [The Reflection code](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/reflect/generics/parser/SignatureParser.java#SignatureParser.parseBounds %28%29)では、先読みは全くありません。だから、「*クラス境界を離れてしまうのは、インタフェースがバインドされている場合にのみ実行されます」という仮定は真実かもしれませんが、仕様と実装の間にはまだ不一致があります。 。 – Holger
@Lukas申し訳ありませんが、私はそのビットについて間違っていたようです。 – Antimony