2013-04-27 18 views
1

讓我先說,我DID搜索幾個小時,並沒有找到我所需要的。不同類型的數組列表不用鑄造?

我需要運行類(應用程序)的數組並使用當前應用程序的變量和方法。

public class App { 
    public final Integer number = 0; 
} 

public class Player extends App { 
    public final Integer number = 1; 
} 

public class Navigation extends App { 
    public final Integer number = 2; 
} 

public class Phone extends App { 
    public final Integer number = 3; 
} 


private ArrayList<App> apps = new ArrayList<App>(); 

apps.add(new Player()); 
apps.add(new Navigation()); 
apps.add(new Phone()); 

,如果我做

apps.get(0).number // = 0 

我得到父母的(APP)

數量,如果我將它轉換爲玩家

(Player) apps.get(0).number // = 1 

我得到期望的結果

現在,我想ru n到所有的N個應用程序(可能不止3)在應用 多的地方,但我不想做的事:

if (gun instanceof Player) 
{ 
    Player p = (Player) apps.get(0); 

}else if .... N times... in N places 

我也不想讓應用的接口,因爲我需要該應用默認。

如果你有更好的主意,就不需要使用數組列表。

在此先感謝。

+0

我想我們需要知道你打算用'Player'等類型做什麼,然後才能提供幫助。如果你想用不同的類型來做同樣的事情,那麼你通常會讓它們實現一個接口或者一個特定類型的子類。 – 2013-04-27 09:39:05

回答

5

使用方法而不是最終變量。 App.getNumber(),那麼每個類都可以覆蓋該方法以返回適當的值。每個類都可以返回相同不變,但定義常量爲私有,並確保您使用的getter方法

0

使用一個抽象方法或接口:

摘要方法:

public absteact class App { 
    public absteact int getNumber(); 
} 

public class Player extends App { 
    public int getNumber() {return 1:} 
} 
// etc 

接口:

public interface HasNumber { 
    public int getNumber(); 
} 

public absteact class App implements HasNumber { 
} 

public class Player extends App { 
    public int getNumber() {return 1:} 
} 
// etc 

接口版本是從典型的設計的角度來看優選的,但兩者都可以接受

1

基本問題是,在Java中,數據成員不是多態的。這意味着以下內容

public class Player extends App { 
    public final Integer number = 1; 
} 

不覆蓋App.number。它所做的是創建一個與App.number完全無關的新數據成員,但也稱爲number

因此,當您執行obj.number時,編譯時類型obj將決定哪個number被訪問。 obj的運行時類型不起作用。

爲了實現多態行爲,使用方法:

public class App { 
    public Integer getNumber() { return 0; } 
} 

public class Player extends App { 
    @Override 
    public Integer getNumber() { return 1; } 
} 

... 

一個更清潔的方式就是讓App到任何一個抽象類或接口,使App.getNumber()是抽象的,必須在派生類中重寫。

0

您可以使用一種方法創建一個接口並在所有類中實現該接口的方法,您將在ArrayList中添加所有類,然後您可以直接獲取數值,查看它可能對您有幫助的示例。

import java.util.ArrayList; 

public class Manager1 { 

public static void main(String[] args) { 
    ArrayList<App> list = new ArrayList<App>(); 
    list.add(new Playre()); 
    list.add(new Navigation()); 
    list.add(new Phone()); 

    System.out.println(list.get(0).getNumber()); 
} 
} 

interface App { 
public abstract int getNumber(); 
} 
class Playre implements App { 
private final int number = 1; 
@Override 
public int getNumber() { 
    return number; 
} 
} 
class Navigation implements App { 
private final int number = 2; 
@Override 
public int getNumber() { 
    return number; 
} 
} 
class Phone implements App { 
private final int number = 3; 
@Override 
public int getNumber() { 
    return number; 
} 
}