私は現在 Java コンパイラを作成しており、セクション 15.12.2.7 を実装しています。JLS7 ( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 ) の、仕様の最も厄介なセクションの 1 つです。仕様がどういうわけか指定不足またはあいまいに見えるため、まだ1つの問題があります。私の問題はこの行です:
lcta(U)=?U の上限が Object の場合、そうでない場合は ? lub(U,Object) を拡張します
U は任意の型式です。型式の上限は? さらに、なぜ lcta は常にワイルドカードなのですか?
仕様が定義する
CandidateInvocation(G) = lci(Inv(G)) .
ここで、たとえば、Inv(G) = { List<String> } の場合を考えてみましょう。つまり、可能な唯一の候補呼び出しは、単一のパラメーター化された型です。さて、ルールにより
lci(G<X1, ..., Xn>) = G<lcta(X1), ..., lcta(Xn)> ,
CandidateInvocation( G ) = lci( { List<String> } ) の結果は次のように定義されます。
List<lcta(文字列)>
私の意見では、lcta は単純にここで String を返す必要があります。List<String> が唯一の可能な呼び出しである場合は、List<String> を引数として推測することをお勧めします。ただし、lcta(U) の定義は、結果が次のいずれかであることを示しています。また ?lub(...) を拡張するため、結果は常にワイルドカードになります。これは奇妙に思えます。ここで何を誤解していますか?