2014-10-29 5 views
1

У меня есть два класса в разных пакетах, подобных этому. Базовый класс:Метод Android с видимостью по умолчанию (пакет), вызванной неправильно с ART

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.boo() Я ожидаю, чтобы получить «ребенка» распечатана. Это то, что я обычно получаю. С Dalvik он работает всегда. Но когда я переключаюсь на АРТ, у меня получается 2 разных выхода.

Когда child.boo() вызывается из «дерева пакетов» класса Child, я получаю «Child». Проблема в том, что я вызываю его из класса в пакете com.example.artpackageprivate.base. Результатом является «Base», хотя объект является экземпляром класса Child.

Вот класс активности код, который делает вызовы (активность содержит только две кнопки):

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(); 
    } 
} 

Running этот код на Dalvik и на АРТ (как андроида KitKat) Я получаю 2 разные результаты , При нажатии BaseButton результат всегда «Base». Результат ChildButton - «Ребенок» на Dalvik и «Base» на ART. Как это возможно? Это какая-то ошибка в АРТ?

ответ

0

Это была известная ошибка в Dalvik (и won't be fixed in Dalvik):

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

Base.boo() Поскольку это частный пакета: оно не может быть изменено в другом пакете. Таким образом, результат с АРТ правильный; результат с Dalvik ошибочен.

Понятие "дерева пакетов" не существует в Java:

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

находятся всего в 3-х различных пакетах: нет особого отношения между com.company.a и com.company.a.b

+0

КАМИ, но Java является OK с теми же сигнатурными методами в родительском и дочернем. (не переопределяя). Затем, когда вы вызываете этот метод в экземпляре родителя, метод родителя вызывается, а на дочернем экземпляре вызывается метод child. Здесь на объекте экземпляра ребенка вызывается метод родителя. Это странно. Прежде всего, когда вы вызываете 'mChild.boo()' вместо 'Base.redirect (mChild)', вы получите правильный результат. – bio007

Смежные вопросы