1

このような異なるパッケージに2つのクラスがあります。基本クラス:

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 クラスの「package tree」から child.boo() を呼び出すと「Child」を取得します。問題は、パッケージ com.example.artpackageprivate.base のクラスから呼び出すときです。オブジェクトはクラス Child のインスタンスですが、結果は「Base」です。

呼び出しを行っている 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 に答える