Java 7中泛型类的变量访问更改

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

以下是一些使用Java 6编译但不能在Java 7中编译的代码的简单示例。

public class Test<T extends Test> {

  private final int _myVar;

  public Test(int myVar) {
    _myVar = myVar;
  }

  public int get(TestContainer<T> container){
    T t = container.get();
    return t._myVar;
  }

  private static class TestContainer<T extends Test> {
    private final T _test;
    private TestContainer(T test) {
      _test = test;
    }
    public T get(){
      return _test;
    }
  }
}

在Java 7中,它无法在该get(TestContainer<T> container)方法中编译,并出现以下错误:

错误:_myVar在测试中具有私人访问权限

我不明白为什么这不再编译 - 在我看来它应该。变量t是类型的T,必须扩展Test。它试图访问类内_myVar实例的字段。TestTest

事实上,如果我将该方法更改为get(TestContainer<T> container)以下内容,则会编译(不带任何警告):

public int get(TestContainer<T> container){
  Test t = container.get();
  return t._myVar;
}
  • 为什么这不再编译?
  • 这是Java 6中的一个错误吗?如果是这样,为什
  • 这是Java 7中的错误吗?

我有一个谷歌搜索Oracle数据库中的数据库,但没有发现任何东西在这...

提问于
用户回答回答于

§4.9 ...然后,交集类型与具有空主体,直接超类Ck和直接超接口T1',...,Tn'的类类型(§8)具有相同的成员,在同一个包中声明,路口类型出现。

从我对该JLS部分的理解中,您使用类型变量<T extends Test>创建下列交点:

package <the same as of Test>;

class I extends Test {}

因此,当您访问类型的T成员时,实际上访问交集类型的成员I。由于私有成员永远不会被访问此类成员的子类型继承而导致编译错误。另一方面,交叉路口的事实允许访问包私有(默认)和受保护的成员

...在相交类型出现的相同包中声明。

用户回答回答于

解决此问题的方法是删除嵌套类的通用参数。除非你有一个使用案例,内部和外部T可以不同,它们是多余的。他们所做的只是造成这种悲伤。

扫码关注云+社区