具有默认(包)可见性的Android方法与ART调用不正确

时间:2014-10-29 09:53:06

标签: android override dalvik android-runtime package-private

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

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时,我得到两个不同的输出。

当从Child类的“包树”调用child.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中的某种虫子吗?

1 个答案:

答案 0 :(得分:0)

这是Dalvik中的一个已知错误(以及它won't be fixed in Dalvik):

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

由于Base.boo()是包私有:它不能在另一个包中重写。因此ART的结果是正确的;达尔维克的结果是错误的。

"包树"的概念不存在于java:

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

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