-
Bug
-
Resolution: Fixed
-
P3
-
7u1, 7u10
FULL PRODUCT VERSION :
java version " 1.7.0_10 "
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
The attached source code compiles without warnings in Java 1.6 but fails with errors in Java 1.7 with:
c:\temp>c:\tools\jdk1.7.0_10\bin\javac Foo.java
Foo.java:16: error: data has private access in Foo
x.data.clear();
^
Foo.java:17: error: data has private access in Foo
x.data.putAll(data);
^
2 errors
It appears that Java 1.7 will no longer allow access to private fields, even within the same class, if that access happens through a genericized reference.
It is likewise program if the access is to a private method, rather than a private field, as in this variant of the test class:
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() {
}
public abstract V getThis(); /** Implement as return this */
public abstract V getEmpty(); /** Implement as return new V() - whatever V is */
// ... more methods here ...
public V copy() {
V x = getEmpty();
x.theData().clear();
x.theData().putAll(data);
return x;
}
private Map<String,Object> theData() {
return data;
}
}
The attached code is a greatly reduced version of an in-house library class what worked in 1.6 (javac 1.6.0_31) but will no longer compile in 1.7 (1.7.0_10).
REGRESSION. Last worked in version 6u31
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the example Foo.java class in both 1.6 and 1.7. 1.7 won't compile it.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
I believe 1.7 should compile this class.
ACTUAL -
1.7 doesn't compile with: 'error: data has private access in Foo'
ERROR MESSAGES/STACK TRACES THAT OCCUR :
c:\temp>c:\tools\jdk1.7.0_10\bin\javac Foo.java
Foo.java:16: error: data has private access in Foo
x.data.clear();
^
Foo.java:17: error: data has private access in Foo
x.data.putAll(data);
^
2 errors
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
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() {
}
public abstract V getThis(); /** Implement as return this */
public abstract V getEmpty(); /** Implement as return new V() - whatever V is */
// ... more methods here ...
public V copy() {
V x = getEmpty();
x.data.clear();
x.data.putAll(data);
return x;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
None at the moment.
java version " 1.7.0_10 "
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.1.7601]
A DESCRIPTION OF THE PROBLEM :
The attached source code compiles without warnings in Java 1.6 but fails with errors in Java 1.7 with:
c:\temp>c:\tools\jdk1.7.0_10\bin\javac Foo.java
Foo.java:16: error: data has private access in Foo
x.data.clear();
^
Foo.java:17: error: data has private access in Foo
x.data.putAll(data);
^
2 errors
It appears that Java 1.7 will no longer allow access to private fields, even within the same class, if that access happens through a genericized reference.
It is likewise program if the access is to a private method, rather than a private field, as in this variant of the test class:
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() {
}
public abstract V getThis(); /** Implement as return this */
public abstract V getEmpty(); /** Implement as return new V() - whatever V is */
// ... more methods here ...
public V copy() {
V x = getEmpty();
x.theData().clear();
x.theData().putAll(data);
return x;
}
private Map<String,Object> theData() {
return data;
}
}
The attached code is a greatly reduced version of an in-house library class what worked in 1.6 (javac 1.6.0_31) but will no longer compile in 1.7 (1.7.0_10).
REGRESSION. Last worked in version 6u31
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the example Foo.java class in both 1.6 and 1.7. 1.7 won't compile it.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
I believe 1.7 should compile this class.
ACTUAL -
1.7 doesn't compile with: 'error: data has private access in Foo'
ERROR MESSAGES/STACK TRACES THAT OCCUR :
c:\temp>c:\tools\jdk1.7.0_10\bin\javac Foo.java
Foo.java:16: error: data has private access in Foo
x.data.clear();
^
Foo.java:17: error: data has private access in Foo
x.data.putAll(data);
^
2 errors
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
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() {
}
public abstract V getThis(); /** Implement as return this */
public abstract V getEmpty(); /** Implement as return new V() - whatever V is */
// ... more methods here ...
public V copy() {
V x = getEmpty();
x.data.clear();
x.data.putAll(data);
return x;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
None at the moment.
- duplicates
-
JDK-7022052 Invalid compiler error on private method and generics
-
- Closed
-