当前位置: 首页 > 面试题库 >

Java 7中通用类的变量访问权限的更改

林彬
2023-03-14
问题内容

这是一些使用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。它试图从class内访问_myVar实例的字段。Test``Test

确实,如果我将方法更改为get(TestContainer<T> container)以下方法,则它将编译(没有警告):

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

我有一个Google并在Oracle Bug数据库中进行了搜索,但是在此上却没有找到任何东西。


问题答案:

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

根据我对JLS零件的了解,您的带有类型变量的情况将<T extends Test>创建以下交集:

package <the same as of Test>;

class I extends Test {}

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

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



 类似资料:
  • 本文向大家介绍Python中设置变量访问权限的方法,包括了Python中设置变量访问权限的方法的使用技巧和注意事项,需要的朋友参考一下 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性: 如果要让内部属性不被外部访问,可以把属性

  • 本文向大家介绍java类访问权限与成员访问权限解析,包括了java类访问权限与成员访问权限解析的使用技巧和注意事项,需要的朋友参考一下 在写代码的时候有个问题:包内定义了一个接口类,另外一个包要实现它,这里采用接口隔离与依赖倒置原则,将两个包的依赖关系倒置过来。但是,这里就遇到了一个问题,实现类采用工厂模式来实例化,所以实现类就不想暴露给包外,但是实现类还要实现public接口。所以这里有产生了一

  • 问题内容: 我想在docker上运行jenkins并更改用户访问权限,以便可以读取SSH密钥并访问git。这是dockerfile的示例 生成时输出成功,访问已更改! 但是,当我进入访问设置为默认时,chmod无法正常工作 知道为什么这种行为吗? 问题答案: 发生这种情况是因为在基本映像中进行了定义。您可以通过3种方式中的任何一种来解决此问题 您可以在构建之前在主机上修复权限,它应该可以工作。 您

  • 问题内容: 我一直在寻找一些Java基本集合(的宝库,fastutil,HPPC)和我已经注意到,类变量有时声明为图案的局部变量。例如: 我已经进行了一些基准测试,看来这样做时速度 稍 快,但是为什么会这样呢?我试图了解如果注释掉函数的前三行,那么Java将有何不同之处。 注意:这似乎与此问题相似,但这是针对c ++的,并且没有解决为什么声明它们的原因。 问题答案: 此处的关键字是红色鲱鱼。之所以

  • 问题内容: 在内部类中,可以访问外部类的变量,但不能访问方法的局部变量。我了解了无法访问方法的局部变量的部分,但我想知道为什么外部类变量可以访问? 我的理解是,由于内部类与外部类绑定,因此只要父级可用,子级就可以访问其父级变量。我对么? 问题答案: 假设您的外部类在内部类的范围内(非静态)被称为,以获取该字段。 例如, 其中Outer是类的名称,并标识该字段。 您也可以直接抓取它,但是如果由于阴影