2015-10-08 4 views
6

インタフェース:交差点の種類を使用する想定元本クラスは、アクセスの変更を必要とする場合、交差点の種類を使用することができませんでし

interface PublicCloneable { 
    Object clone(); 
} 

interface HasPosition { 
    // doesn't matter 
} 

が試み:javac 1.8.0_60でコンパイルする

@SuppressWarnings("unchecked") 
<E extends PublicCloneable & HasPosition> E cloneAndIncrementPosition(E elem) { 
    final E clone = (E)elem.clone(); 
    // rest omitted 
} 

試み:

$ javac xx.java 
xx.java:13: error: clone() in Object cannot implement clone() in PublicCloneable 
    <E extends PublicCloneable & HasPosition> E cloneAndIncrementPosition(E elem) { 
    ^
    attempting to assign weaker access privileges; was public 
xx.java:14: error: clone() has protected access in Object 
     final E clone = (E)elem.clone(); 
          ^
2 errors 

なぜこの交差型はjavacでは無効ですか?

+0

興味深いことに、 'E'から上限の' HasPosition'を削除すると、これがコンパイルされます。 – rgettman

+0

これはEclipseでコンパイルされます... –

答えて

8

これはjavacのバグのようです。

バウンドTと型変数Xのメンバー

http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.4

& & I1 ... &では、交差点の種類のメンバーである(§4.9)T & & I1 ...

で&

http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.9

すべての交差型T1 &を... & Tnが交差タイプのメンバーを同定する目的のための概念的なクラスまたはインタフェースを誘導...

Ckがオブジェクトである場合、概念的なインタフェースが誘導され...ています直接的上位のT1' 、...、Tnは」

したがって、PublicCloneable & HasPositionため、概念的なインタフェースがOKであるべきそれらの両方を、延びる、導入されます。

+0

ありがとう、これは私が疑っていたものです。あなたが同意してうれしい。 – Archie

+1

この仕様のこの部分はひどく書かれています。いずれにしても、ユースケースは完全に正当なものであり、受け入れられるべきです。 – ZhongYu

+0

説明をありがとう!このエラーを抑制し、そのようなコードをコンパイルする方法はありますか? –

0

clone()メソッドの2つの互換性のないシグネチャを持つ型に制約されているため、最初のエラーがあなたに伝えようとしているので、コードは機能しません。

+0

たとえば、 'HasPosition'の' clone'( 'Object'から継承)は' protected'ですが、 'PublicCloneable'''clone'はインターフェースなので' public'です。そうですか? –

関連する問題