このような異なるパッケージに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の何らかのバグですか?