2015-10-13 16 views
17

CompilingFunzionale riferimento alla Object.clone() non compila

import java.util.concurrent.Callable; 

class Ideone 
{ 
    Callable<?> x = super::clone; 
} 

utilizzando Oracle JDK fornisce:

Main.java:6: error: incompatible types: invalid method reference 
    Callable<?> x = super::clone; 
        ^
    clone() has protected access in Object 

che non ha senso come classe dovrebbe essere in grado di accedere al suo genitore protetto metodi. Questa espressione funziona bene nel compilatore di Eclipse.

Inoltre, () -> super.clone() compila bene ....

È questo un bug?

+2

Does 'this :: clone' funziona? – thecoop

+0

Posso riprodurlo con JDK 1.8.0_51 ed Eclipse Mars 4.5.0. Sembra un bug di Eclipse. – Tunaki

+0

Funziona bene JDK 1.8.0_60 ed Eclipse Mars – Flown

risposta

6

super non è in realtà un'espressione e non c'è alcun tipo statico di cui parlare. super.foo() ha lo stesso accesso di this.foo(); è solo che, l'invocazione del metodo viene tradotta in modo diverso nel codice byte, come "super invoke", al contrario di "invoke normale".

JLS non è molto chiaro su questo; per esempio. nella sezione di protected access, il modulo super.protectedMember non è menzionato; ma ovviamente quella forma dovrebbe essere discussa in JLS; e dovrebbe essere accessibile. (La sezione suggerisce che X::m e X.m devono essere trattati allo stesso accesso w.r.t. destra)

Nella sezione del method reference, la formulazione è anche vaga; tuttavia, super::clone dovrebbe essere accessibile allo stesso modo di super.clone() accessibile.

Un bug report è stato creato: JDK-8139836: “Can't use super::x method reference when x is protected”. Il suo stato attuale è che verrà risolto in Java 9.

+1

regole di accesso protetto - http://stackoverflow.com/a/32263340/2158288 – ZhongYu

+0

(Si prega di consultare il mio [commento] (# commento54031785_33107500).) 6.6.2.1 è scritto in un linguaggio molto preciso, quindi direi che non è vago sul caso: il caso è letteralmente indefinito. Tuttavia, poiché questo modulo è necessario per implementare un utile 'clone()', non riesco a credere che sia mancato nelle specifiche per così tanto tempo. –

+1

beh ... diresti che anche la forma non definita 'clone()' non è definita? forse è ben chiaro che è equivalente a 'this.clone()'.Similmente, forse, 'super.clone()' è ben compreso, tra il pubblico di destinazione di JLS, come equivalente in molti modi a 'this.clone()' in fase di compilazione. – ZhongYu

Problemi correlati