1

我在这样的不同包中有两个类。基类:

package com.example.artpackageprivate.base;

public class Base {

    protected final Context mContext;

    public Base(final Context context) {
        mContext = context;
    }

    public void foo() {
        boo();
    }

    /*package*/ void boo()
    {
        Toast.makeText(mContext, "Base", Toast.LENGTH_LONG).show();
    }

    public static void redirect(Base object) {
        object.boo();
    }

和子类:

com.example.artpackageprivate.child;

public class Child extends Base {

    public Child(Context context) {
        super(context);
    }

    @Override
    public void foo() {
        boo();
    }

    public /*or whatever*/ void boo()
    {
        Toast.makeText(mContext, "Child", Toast.LENGTH_LONG).show();
    }

我有一个 Child 类的对象,我调用 child.boo() 我希望打印“Child”。这真的是我通常得到的。使用 Dalvik,它实际上总是有效的。但是当我切换到 ART 时,我得到了 2 个不同的输出。

当从 Child 类的“包树”调用 c​​hild.boo() 时,我得到“Child”。问题是当我从包 com.example.artpackageprivate.base 中的类调用它时。结果是“Base”,尽管对象是 Child 类的一个实例。

这是进行调用的 Activity 类代码(Activity 仅包含 2 个按钮):

package com.example.artpackageprivate;

public class MainActivity extends Activity {

    private Base mBase;
    private Child mChild;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBase = new Base(this);
        mChild = new Child(this);
    }

    public void onChildButtonClick(View view) {
        Base.redirect(mChild);
    }

    public void onBaseButtonClick(View view) {
        mBase.foo();
    }
}

在 Dalvik 和 ART(都是 android Kitkat)上运行这段代码,我得到了 2 个不同的结果。按下 BaseButton 结果始终是“Base”。ChildButton 的结果是 Dalvik 上的“Child”和 ART 上的“Base”。这怎么可能?这是ART中的某种错误吗?

4

1 回答 1

0

这是 Dalvik 中的一个已知错误(并且不会在 Dalvik 中修复):

https://code.google.com/p/android/issues/detail?id=60406

因为Base.boo()是包私有的:它不能在另一个包中被覆盖。所以 ART 的结果是正确的;Dalvik 的结果是错误的。

java中不存在“包树”的概念:

com.company.a
com.company.a.b
com.company.b

只是 3 个不同的包:和之间没有特殊关系com.company.acom.company.a.b

于 2014-10-29T10:19:13.630 回答