首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么这段代码可以在Java 1.6中编译,而不能在Java 1.7中编译?

为什么这段代码可以在Java 1.6中编译,而不能在Java 1.7中编译?
EN

Stack Overflow用户
提问于 2013-03-28 20:09:48
回答 1查看 7.5K关注 0票数 16

以下代码在Java 1.6中编译得很好,但在Java 1.7中无法编译。为什么?

代码的相关部分是对私有“data”字段的引用。引用来自定义字段的同一个类,因此看起来是合法的。但它是通过泛型变量实现的。这段代码-基于内部库中的类的简化示例-在Java 1.6中有效,但现在在Java 1.7中不起作用。

我不是在问如何解决这个问题。我已经这么做了。我试图找到一个解释,为什么这个不能再工作了。脑海中浮现出三种可能性:

  • 根据JLS,此代码是非法的,并且永远不应该编译( 1.6版编译器中存在错误,已在1.7中修复)
  • 根据JLS,此代码是合法的,应该进行编译(1.7版编译器中引入了向后兼容性错误)
  • 此代码在JLS

中处于灰色区域。

Foo.java:

代码语言:javascript
复制
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;
    }

}

编译器输出:

代码语言:javascript
复制
> 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

附录。如果引用的是私有方法而不是私有成员变量,则会出现相同的问题。这在Java 1.6中有效,但在1.7中不起作用。

Foo2.java:

代码语言:javascript
复制
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;
    }

}

编译器输出:

代码语言:javascript
复制
> 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);
         ^
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15681444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档