2014-10-29 52 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它實際上始終工作。但是當我切換到ART時,我得到2個不同的輸出。

當Child.boo()從Child類的「包樹」中調用時,我得到「Child」。問題是當我從包com.example.artpackageprivate.base中的類中調用它時。結果是「Base」,儘管該對象是Child類的一個實例。

這裏是正在調用(活動僅包含2個按鈕)Activity類代碼:

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奇巧)的代碼我得到2個不同的結果。按BaseButton結果總是「Base」。 ChildButton的結果是Dalvik上的「Child」和ART上的「Base」。這怎麼可能?這是ART中的某種錯誤嗎?

回答

0

正是在Dalvik的一個已知的錯誤(和它won't be fixed in 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

+0

OK之間沒有特殊關係,但Java是好的,在父母和孩子中使用相同的簽名私人方法。 (而不是覆蓋)然後,當你在父對象的實例上調用這個方法時,會調用父對象的方法,並在子對象的實例上調用子對象的方法。這裏的child的實例對象是parent的方法。這很奇怪。首先,當你調用'mChild.boo()'而不是'Base.redirect(mChild)'時,你會得到正確的結果。 – bio007 2014-10-29 10:55:14

相關問題