2014-10-03 125 views
1

我有一個HashMap的問題。這個問題對於任何其他泛型(LinkedList等)都是一樣的。比方說,我有2類新:Java HashMap來存儲不同的對象

A類:

public class A { 
    public void aMethod() { 
     System.out.println("A"); 
    } 

B類,擴展答:

public class B extends A { 
    public void bMethod() { 
     System.out.println("B"); 
    } 

現在在main方法的類,我做一個HashMap來存儲這2個分類的實例:

import java.util.HashMap; 

public class TestList { 
    public static void main(String[] args) { 

     //I'm making 2 objects representing A and B class: 

     A objA = new A(); 
     B objB = new B(); 

     // I'm making a HasMap storing A class objects, where I can 
     // also store B objects, because B is subclass of A 

     HashMap<String, A> myObjects = new HashMap<String, A>(); 
     myObjects.put("objA", objA); 
     myObjects.put("objB", objB); 

     // using a method from class A is working fine on objA: 
     myObjects.get("objA").aMethod(); 

     // but if I want to use a method from B class on objB 
     // I need to cast: 
     ((B) myObjects.get("objB")).bMethod(); 

    } 
} 

有沒有什麼方法可以將對象從不同類別存儲在一個HashMap中,不需要使用其他(擴展)方法進行投射?

我想使用:

myObjects.get("objB")).bMethod(); 

沒有鑄造。謝謝。

+1

沒有投射,並調用任意方法?當然不是。這是Java的重點,明確避免不知道你在做什麼。 – 2014-10-03 13:36:28

+1

如果您需要經常施放,也許這意味着您可以改進「A」和「B」類的設計。 – ericbn 2014-10-03 13:39:54

回答

3

不,沒有。通過使用A參數化類型,您告訴編譯器它唯一可以依賴的就是映射中的對象是A的一個實例。如果您在其中放置了一個子類,它將接受它,但它不能知道那個特定的項目是B,所以你將永遠需要施放。