eclipse 编译器或 javac 中的错误?

问题描述 投票:0回答:3

谁是对的? Eclipse 还是 javac?

-------------- c/v/A.java ---------------

package c.v;
public class A<T> {
}

-------------- c/v/B.java ---------------

package c.v;
public class B extends A<B.Secret> {
  private class Secret {};
}

Eclipse 编译 B.java 就可以了。

Javac 有问题。

$ javac c/v/B.java
c/v/B.java:3:c.v.B.Secret 在 c.v.B 中具有私有访问权限
公共类 B 扩展 A {
                           ^
    1 个错误
eclipse generics javac
3个回答
7
投票

Java 语言规范的相关部分必须是:

§8.1.4: [...] ClassType 必须命名可访问的(第 6.6 节)类类型,否则会发生编译时错误。

§6.6.1: [...] 仅当类型可访问并且声明成员或构造函数允许访问时,引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数才可访问:

  • 如果成员或构造函数被声明为公共,则允许访问。接口的所有成员都是隐式公共的。 [...]
    • 否则,如果成员或构造函数被声明为私有,则当且仅当访问发生在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时,才允许访问。

因此,由于 ClassType 不在类的主体内,因此在此位置无法访问

B.Secret
,因此
A<B.Secret>
不可访问,因此应该会发生编译时错误。


6
投票

Eclipse 是错误的。如果您将某物做广告

extends A<X>

你需要了解 A 和 X。


3
投票

我倾向于认为 javac 是正确的。为了创建一个新班级

A<B.Secret>

泛型需要访问它使用的类。 B 随后扩展该类的事实是次要的。

© www.soinside.com 2019 - 2024. All rights reserved.