该字段永远不会在本地读取(catch-22)

时间:2012-09-06 19:10:32

标签: android eclipse

有人面临这样的问题吗?

某些字段标有警告“该字段永远不会在本地读取”:

enter image description here

但是当我压制警告时,Eclipse开始宣称这是不必要的:

enter image description here

结果,我无法摆脱警告。

Eclipse SDK 3.6.2

编辑:

BlockBase类是抽象的。但是将abstract关键字添加到类并将构造函数可见性更改为protected并不会改变任何内容。我想这种行为的真正原因是类市场是私有的,因此编译器假定应该从类可见性区域内访问字段。它没有考虑到这些字段可以从具有另一种可见性(public class DataBlock extends BlockBase)的子项访问。

我将BlockBase的可见度更改为protected,并且解决了问题。我不喜欢将其更改为公开,因为它会导致BlockBase从父类外部可见,但更改protected的可见性不会改变任何内容,因为我的父类不会没有继承的课程。

但无论如何,这种编译器行为是不正确的。

enter image description here

编辑2

- 或 -

如何重现问题

1。第一个文件:

public class testClass {

    private abstract class x
    {
        public int theProblem;
    }

    public class y extends x 
    {
    }

}

2。第二档:

public class anotherClass {

    public void accessToTheProblem()
    {
        testClass.y a = (new testClass()).new y();
        a.theProblem = 5;
        Log.i("TEST", "See, I can read theProblem: " + a.theProblem);
    }

}

在Eclipse SDK 3.6.2下,您将看到带有警告的theProblem声明市场:

  

该字段永远不会在本地读取

2 个答案:

答案 0 :(得分:4)

也许您打算BlockBase成为像BaseAdapter这样的abstract类?

  • 如果您不打算使用BlockBase声明blockBase = new BlockBase(widget);对象,请将abstract添加到类定义中并删除构造函数。编译器将了解您计划在子类中使用这些变量,它将删除警告。

  • 否则编译器是正确的,您应该删除这些变量,因为它们永远不会在BlockBase中使用。 (如果您打算在DataBlock中使用它们,请将它们剪切并粘贴在那里,但它们对BlockBase毫无意义。)

答案 1 :(得分:0)

在某些情况下,编译器会添加合成方法来模拟对嵌套/外部类字段的访问。也许这会混淆支票。您应该能够通过将Eclipse编译器警告首选项“访问封闭类型的不可访问成员”设置为高于“忽略”的值来验证它是否起作用。

除此之外,我建议升级到3.8或4.2,也许我们正在推测一个长期修复的错误。