निम्न कोड जावा 1.6 में ठीक है, लेकिन जावा 1.7 में संकलित करने में विफल रहता है। क्यूं कर?जावा 1.6 में यह कोड संकलित क्यों करता है लेकिन जावा 1.7 में नहीं?
कोड का प्रासंगिक भाग निजी 'डेटा' फ़ील्ड का संदर्भ है। संदर्भ उसी वर्ग के भीतर से है जिसमें फ़ील्ड परिभाषित किया गया है, और ऐसा लगता है कि कानूनी है। लेकिन यह एक सामान्य रूप से टाइप किए गए चर के माध्यम से हो रहा है। यह कोड - इन-हाउस लाइब्रेरी से कक्षा के आधार पर एक छीन लिया गया उदाहरण - जावा 1.6 में काम किया लेकिन अब जावा 1.7 में नहीं है।
मैं यह नहीं पूछ रहा हूं कि इस के आसपास कैसे काम करना है। मैंने पहले ही ऐसा कर लिया है। मैं एक स्पष्टीकरण खोजने की कोशिश कर रहा हूं कि यह अब और क्यों काम नहीं करता है। तीन संभावनाएं मन में आते हैं:
- इस कोड नहीं कानूनी JLS के अनुसार है और कभी नहीं तैयार की है चाहिए
- इस कोड कानूनी है (वहाँ 1.6 संकलक में एक बग, 1.7 में ठीक किया गया था) JLS के अनुसार और (एक पश्चगामी संगतता बग 1.7 संकलक में शुरू किया गया है)
- इस कोड JLS
Foo.java:
import java.util.TreeMap;
import java.util.Map;
public abstract class Foo<V extends Foo<V>> {
private final Map<String,Object> data = new TreeMap<String,Object>();
protected Foo() { ; }
// Subclasses should implement this as 'return this;'
public abstract V getThis();
// Subclasses should implement this as 'return new SubclassOfFoo();'
public abstract V getEmpty();
// ... more methods here ...
public V copy() {
V x = getEmpty();
x.data.clear(); // Won't compile in Java 1.7
x.data.putAll(data); // "
return x;
}
}
संकलक उत्पादन:
> c:\tools\jdk1.6.0_11\bin\javac -version
javac 1.6.0_11
> c:\tools\jdk1.6.0_11\bin\javac c:\temp\Foo.java
> c:\tools\jdk1.7.0_10\bin\javac -version
javac 1.7.0_10
> c:\tools\jdk1.7.0_10\bin\javac c:\temp\Foo.java
Foo.java:18: error: data has private access in Foo
x.data.clear();
^
Foo.java:19: error: data has private access in Foo
x.data.putAll(data);
^
2 errors
परिशिष्ट। एक ही समस्या तब होती है जब संदर्भ किसी निजी सदस्य चर के बजाय निजी विधि के लिए होता है। यह जावा 1.6 में काम करता है लेकिन 1.7 में नहीं।
Foo2.java:
import java.util.TreeMap;
import java.util.Map;
public abstract class Foo2<V extends Foo2<V>> {
private final Map<String,Object> data = new TreeMap<String,Object>();
protected Foo2() { ; }
// Subclasses should implement this as 'return this;'
public abstract V getThis();
// Subclasses should implement this as 'return new SubclassOfFoo();'
public abstract V getEmpty();
// ... more methods here ...
public V copy() {
V x = getEmpty();
x.theData().clear(); // Won't compile in Java 1.7
x.theData().putAll(data); // "
return x;
}
private Map<String,Object> theData() {
return data;
}
}
संकलक उत्पादन:
> c:\tools\jdk1.6.0_11\bin\javac c:\temp\Foo2.java
> c:\tools\jdk1.7.0_10\bin\javac c:\temp\Foo2.java
Foo2.java:18: error: theData() has private access in Foo2
x.theData().clear();
^
Foo2.java:19: error: theData() has private access in Foo2
x.theData().putAll(data);
^
मैं दोनों जेनरेट की गई कक्षा फ़ाइलों को विघटित करने का सुझाव दूंगा, तो अंतर स्पष्ट होना चाहिए। – Landei
@Landei 1.7 मामले में कोई जेनरेट क्लास फ़ाइल नहीं है, क्योंकि संकलक इसे संकलित करने से इंकार कर देता है। –