2014-10-03 2 views
1

У меня проблема с HashMap. Эта проблема такая же для любых других дженериков (LinkedList и т. Д.). Скажем, у меня есть 2 classess: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"); 
    } 

Теперь в классе с основным методом, который я делаю HashMap для хранения экземпляры этого 2 classess:

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

    } 
} 

есть ли способ сохранить объект из разных classess в одном HashMap, который не требует литья для использования других (расширенных) методов?

Я хотел бы использовать:

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

Без литья. Спасибо.

+1

Без кастинга и вызова произвольных методов? Конечно нет. Это точка Java, чтобы явно не знать, с чем вы работаете. –

+1

Если вам нужно часто бросать, возможно, это означает, что вы можете улучшить дизайн своих классов 'A' и' B'. – ericbn

ответ

3

Нет, не существует. Путем параметризации типа с помощью A вы сказали компилятору, что единственное, на что он может рассчитывать, это то, что объект на карте является экземпляром A. Если вы поместите подкласс там, он примет его, но он не сможет знайте, что этот конкретный элемент - B, поэтому вам всегда придется бросать.

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