2015-10-13 1 views
17

CompilingFunktions Bezug auf Object.clone() lässt sich nicht kompilieren

import java.util.concurrent.Callable; 

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

Oracle JDK gibt:

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

die keinen Sinn als eine Klasse macht sollte seine Lage sein, Eltern den Zugriff auf die geschützten Methoden. Dieser Ausdruck funktioniert im Eclipse-Compiler einwandfrei.

Auch () -> super.clone() kompiliert fein ....

Ist das ein Fehler?

+2

Funktioniert 'this :: clone'? – thecoop

+0

Ich kann dies mit JDK 1.8.0_51 und Eclipse Mars 4.5.0 reproduzieren. Scheint wie ein Eclipse-Bug. – Tunaki

+0

Funktioniert gut JDK 1.8.0_60 und Eclipse Mars – Flown

Antwort

6

super ist eigentlich kein Ausdruck, und es gibt keine statische Art zu sprechen. super.foo() hat den gleichen Zugriff wie this.foo(); Es ist nur so, dass der Methodenaufruf im Byte-Code anders übersetzt wird als "Super-Aufruf", im Gegensatz zu "Normaler Aufruf".

JLS ist nicht sehr klar auf diesem; z.B. im Abschnitt protected access wird die super.protectedMember Form nicht erwähnt; aber offensichtlich sollte diese Form in JLS diskutiert werden; und es sollte zugänglich sein. (Der Abschnitt legt nahe, dass X::m und X.m sollen das gleiche w.r.t. Zugriffsrecht behandelt werden)

Im Abschnitt von method reference ist die Formulierung auch vage; dennoch sollte super::clone auf die gleiche Weise zugänglich sein wie super.clone() zugänglich ist.

Ein Fehlerbericht wurde erstellt: JDK-8139836: “Can't use super::x method reference when x is protected”. Sein aktueller Status ist, dass es in Java 9 behoben wird.

+1

Regeln des geschützten Zugangs - http://Stackoverflow.com/a/32263340/2158288 – ZhongYu

+0

(Bitte sehen Sie meine [Kommentar] (# comment54031785_33107500).) 6.6.2.1 ist in sehr präziser Sprache geschrieben, also würde ich sagen, dass es nicht ist vage zu dem Fall: Der Fall ist buchstäblich undefiniert. Da diese Form jedoch benötigt wird, um ein nützliches 'clone()' zu implementieren, kann ich kaum glauben, dass es so lange in der Spezifikation fehlte. –

+1

naja ... würdest du sagen, dass die unqualifizierte 'clone()' Form auch undefiniert ist? vielleicht ist es gut verstanden, dass es äquivalent zu 'this.clone()' ist.In ähnlicher Weise ist "super.clone()" möglicherweise unter der Zielgruppe von JLS so verstanden, dass sie zur Kompilierungszeit in vielerlei Hinsicht äquivalent zu "this.clone()" ist. – ZhongYu