2015-10-08 10 views
6

Interfacce:grado di utilizzare un tipo di intersezione quando la classe nozionale richiede la modifica accesso

interface PublicCloneable { 
    Object clone(); 
} 

interface HasPosition { 
    // doesn't matter 
} 

tenta di utilizzare tipo intersezione:

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

tentativo per compilare con javac 1.8.0_60:

$ 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 

Perché questo tipo di intersezione non è valido per javac?

+0

È interessante notare che se si rimuove il limite superiore 'HasPosition' da' E', questo viene compilato. – rgettman

+0

Questo compila su Eclipse ... –

risposta

8

Questo sembra un errore javac.

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

I membri di un tipo variabile X con limite T & I1 & ... & In sono i membri del tipo intersezione (§4.9) T & I1 & ... & In

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

Ogni tipo intersezione T1 & ... & Tn induce una classe fittizia o interfaccia al fine di identificare i membri del tipo intersezione ...

Se Ck è oggetto, un'interfaccia fittizia è indotta ... ha superinterfacce diretta T1' , ..., Tn'

Pertanto, per PublicCloneable & HasPosition, un'interfaccia fittizia è introdotto, estendendo entrambi, che dovrebbe essere OK.

+0

Grazie, questo è quello che sospettavo. Sono contento che tu sia d'accordo. – Archie

+1

Bene, questa parte della specifica è scritta male, e non è coerente sotto uno sguardo più attento. In ogni caso, il tuo caso d'uso sembra perfettamente legittimo e dovrebbe essere accettato. – ZhongYu

+0

Grazie per la spiegazione! Qualche modo per sopprimere questo errore e compilare tale codice? –

0

Come il primo errore sta cercando di dirti, il tuo codice non può funzionare, perché stai limitando a tipi con due firme incompatibili per il metodo clone().

+0

, ad esempio, il 'clone' di' HasPosition' (ereditato da 'Object') è' protected', ma '' Clone' di PublicCloneable', poiché è un'interfaccia, è 'public'. È giusto? –

Problemi correlati