2015-10-13 16 views
17

Compilingकार्यात्मक संदर्भ ओरेकल JDK का उपयोग कर

import java.util.concurrent.Callable; 

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

संकलन नहीं है देता है:

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

जो एक वर्ग के रूप कोई मतलब नहीं है तक पहुँचने के लिए अपने माता-पिता के संरक्षित सक्षम होना चाहिए तरीकों। यह अभिव्यक्ति ग्रहण के कंपाइलर में ठीक काम करती है।

इसके अलावा, () -> super.clone() ठीक संकलित ....

यह एक बग है?

+2

क्या यह :: क्लोन' काम करता है? – thecoop

+0

मैं इसे जेडीके 1.8.0_51 और ग्रहण मंगल 4.5.0 के साथ पुन: उत्पन्न कर सकता हूं। एक ग्रहण बग की तरह लगता है। – Tunaki

+0

ठीक काम करता है जेडीके 1.8.0_60 और ग्रहण मंगल – Flown

उत्तर

6

super वास्तव में एक अभिव्यक्ति नहीं है, और इसके बारे में बात करने के लिए कोई स्थिर प्रकार नहीं है। super.foo() पर this.foo() के समान उपयोग है; यह सिर्फ इतना है कि, विधि आमंत्रण का अनुवाद बाइट कोड में "सुपर इनवोक" के रूप में किया जाता है, जैसा कि "सामान्य आक्रमण" के विपरीत होता है।

जेएलएस इस पर बहुत स्पष्ट नहीं है; जैसे protected access के अनुभाग में, super.protectedMember फ़ॉर्म का उल्लेख नहीं किया गया है; लेकिन स्पष्ट रूप से उस फॉर्म पर जेएलएस में चर्चा की जानी चाहिए; और यह सुलभ होना चाहिए। (अनुभाग सुझाव है कि X::m और X.m ही w.r.t. पहुँच सही व्यवहार किया जाना चाहिए)

method reference के अनुभाग में, शब्दों भी अस्पष्ट है, फिर भी, super::clone को उसी तरह से सुलभ किया जाना चाहिए जैसे super.clone() पहुंच योग्य है।

एक बग रिपोर्ट बनाई गई है: JDK-8139836: “Can't use super::x method reference when x is protected”। इसकी वर्तमान स्थिति यह है कि इसे जावा 9 में तय किया जाएगा।

+1

सुरक्षित पहुंच के नियम - http://stackoverflow.com/a/32263340/2158288 – ZhongYu

+0

(कृपया मेरी [टिप्पणी] देखें (# टिप्पणी 54031785_33107500)।) 6.6.2.1 बहुत सटीक भाषा में लिखा गया है, इसलिए मैं कहूंगा कि यह नहीं है मामले पर अस्पष्ट: मामला सचमुच अपरिभाषित है। हालांकि, चूंकि इस फॉर्म को उपयोगी 'क्लोन()' लागू करने की आवश्यकता है, इसलिए मुझे शायद ही विश्वास हो कि यह इतने लंबे समय तक कल्पना में गायब है। –

+1

अच्छी तरह से ... क्या आप कहेंगे कि अयोग्य 'क्लोन()' फॉर्म भी अनिर्धारित है? शायद यह अच्छी तरह से समझा जाता है कि यह 'this.clone()' के बराबर है।इसी तरह, शायद, 'super.clone() 'जेएलएस के लक्षित दर्शकों के बीच, संकलित समय पर' this.clone() 'के कई तरीकों के बराबर समझा जा सकता है। – ZhongYu

संबंधित मुद्दे