2011-10-26 30 views
1

我有一個父對象將實現的父接口和子接口。我製作了一個子界面,因爲我想要一個特定的VehicleEntity對象,如Truck將自己添加到Car的HashMap中。一個Truck將調用VehicleManager的addToCar()方法,將Truck對象添加到Car的hashMap中。我遇到的問題是CarEntity ce = ve;。 Netbeans告訴我要將ve投給CarEntity,但我不想。不應該代碼行是有效的(假設for循環所查看的對象是一個Car對象)?我怎樣才能解決這個問題?將一個父對象分配給一個子對象而不使用Java進行強制轉換

public interface VehicleEntity { 
    getId(); 
    getSpeed(); 
    move(); 
    } 

public interface CarEntity extends VehicleEntity{ 
    addToCar(String c); 
} 

public class Car implements CarEntity{ 
HashMap<String, VehicleEntity> cars = new HashMap<String, VehicleEntity>(); 

    public void addToCar(String c) { 
     cars.add(c); 
    } 
} 

public class VehicleManager { 
    HashMap<String, VehicleEntity> vehicles = new HashMap<String, VehicleEntity>(); 

public void reportToCar(String id) { 
    for (VehicleEntity ve : ve.values()) { 
     if (ve.getId().equals(id)) { 
      CarEntity ce = ve; // Issue here 
     } 
    } 
} 
+0

'reportToCar'方法屬於哪個類? –

+0

class VehicleManager – Dan

+0

這裏還有更多的問題......在addToCar中,你可以在HashMap上調用add。沒有這樣的方法。你需要使用'put(String c,Something s)'。那是什麼東西? –

回答

5

真的,那根本不是有效的。你可以從特定的位置移動到一般位置而不需要投射,但不能再回來。例如,您可以將ArrayList存儲在List變量中,但不能將List放入ArrayList變量而不投射。以同樣的方式,你不能在沒有明確鑄造的情況下駕駛汽車並說它是一輛汽車。

因此,在這種情況下,既然您知道車輛是汽車,就明確地投入汽車。

+0

我明白了。這是我一開始想的,只是需要一些確認。謝謝! – Dan

0

我不能完全肯定它是什麼你想要到達這裏,所以我要列表中的一些糾正類和我最好的猜測第一...

public interface VehicleEntity { 

    public String getId(); 

    public String getSpeed(); 

    public void move(); 

} 

public interface CarEntity extends VehicleEntity { 

    public void addToCar(String key, CarEntity c); 

} 

import java.util.HashMap; 

public class Car implements CarEntity{ 
HashMap<String, VehicleEntity> cars = new HashMap<String, VehicleEntity>(); 

    @Override 
    public void addToCar(String key, CarEntity car) { 
     cars.put(key, this); 
    } 

    @Override 
    public String getId() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    @Override 
    public String getSpeed() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    @Override 
    public void move() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 
} 

...然後告訴你使用泛型一個很酷的技巧:

import java.util.HashMap; 

public class VehicleManager { 

    HashMap<String, VehicleEntity> vehicles = 
     new HashMap<String, VehicleEntity>(); 

    public <T extends VehicleEntity> T report(String id) { 
     for(VehicleEntity ve : vehicles.values()) { 
      if(ve.getId().equals(id)) { 
       @SuppressWarnings("unchecked") 
       T ce = (T)ve; 
       return ce; 
      } 
     } 
     return null; 
    } 

    public void test() { 

     final Car c = report("test"); 

    } 

} 

我已經參數的方法reportT延伸VehicleEntity。它會返回這種類型的東西T。當在方法test()中使用這個時,我們已經說過我們想要一個Car。現在一些類型推斷會繼續,自動調用Car類型的方法report。如果給定ID的地圖中的VehicleEntity不是Car,我們將得到一個ClassCastException,因爲我們試圖在該上下文中調用t方法時投射到Car

+0

我的問題是關於鑄造。我不想演員,但@Micah說它不能完成。 – Dan

+0

@丹有時你只需要施放。但我不確定你的設計究竟是想要達到什麼目標,所以也許不同的方法會產生不同的結果。沒有演員。只是不在你目前的結構。如果每種類型都有獨立的VehicleManager,那麼可以避免使用它(使用泛型),但由於情況並非如此,因此我的建議可以避免爲您製作的VehicleEntity的每個子類型分別創建一個方法。要記住的事情。 –

相關問題