2014-10-04 2 views
-1

Я пытаюсь составить список различных объектов.Сделать список различных объектов Java

Я знаю, что я могу сделать список некоторых объектов, например:

ArrayList<Matrices> list = new ArrayList<Matrices>(); 
list.add(new Matrices(1,1,10)); 
list.add(new Matrices(1,2,20)); 

Но я хочу, чтобы сделать список, который может сделать что-то вроде этого:

list.add (new Object1(a,b,c)); 
list.add (new Object2(e,f)); 

Очевидно Object1 и Объект2 разные.

Пожалуйста, дайте мне руку здесь.

+0

Какие разные объекты? Когда вы их извлечете, как вы узнаете, что это за объект? –

+1

Возможный дубликат [Создать arraylist с несколькими типами объектов?] (Http://stackoverflow.com/questions/19602601/create-an-arraylist-with-multiple-object-types) – Boann

ответ

3

Ответ Vytenis является технически правильным, но вы не должны делать это регулярно. Более расширяемое решение - создать интерфейс и реализовать оба объекта, позволяя списку удерживать оба объекта без потери безопасности и преимуществ, которые обычно приходят со статически типизированными списками. Хотя Java не любит множественное наследование от классов, внедрение нескольких интерфейсов не представляет проблемы.

Например, ваши объявления классов:

class Object1{ 
    ... 
} 
... 
class Object2{ 
    ... 
} 

и добавьте следующее объявление интерфейса на верхнем уровне, где-то -

public interface SharedType{ 
    ... 
} 

для каждого объекта, который вы хотите сохранить, иметь его реализовать интерфейс, подобный этому:

public class Object1 implements SharedType{ 
    ... 
} 

Когда вы объявляете свой список, это:

List<SharedType> mylist = new ArrayList<SharedType>(); 

или любой другой тип списка вы пытаетесь создать, очевидно, он не должен быть ArrayList

Это не будет работать для встроенных типов или классов, кто декларации вы можете «т изменить

Использование интерфейсов в качестве типов является обычной практикой в ​​Java, см http://docs.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html, например

Редактировать

Если вам нужно сохранить различные встроенные типы (например, строки и целые числа), как это предлагается в комментариях, рассмотрите возможность создания вокруг них объекта-оболочки. Это немного громоздко, но вы не можете легко изменить объявление встроенных классов, и использование универсального типа, такого как Object, должно быть последним средством, поскольку оно подрывает сама причина требования спецификации типа в первую очередь ,

Например,

interface Wrapper{} 

class StringWrapper extends Wrapper{ 
    String s; 

    public StringWrapper(String s){ 
     this.s = s; 
    } 
} 

class IntWrapper extends Wrapper{ 
    String i; 

    public StringWrapper(Integer i){ 
     this.i = i; 
    } 
} 

Кто-то смотрит на свой код (включая вас, позже), теперь будет точно знать, что вы пытаетесь использовать в вашем списке. Вы также все еще получаете преимущества статической типизации Java

+0

+1 - это правильный способ делать что-то. Если ваша программа требует хранения несвязанных типов в одной коллекции, вы создаете что-то неправильно. – Qix

+0

Но он не работает для стандартных объектов. Если вам нужно хранить 'String' и' Integer' в том же 'ArrayList' – Jens

2

Используйте List<Object>, там вы сможете хранить что угодно.

+0

'Список ' - это интерфейс и не работает сама по себе. Пожалуйста, добавьте некоторые пояснения. – Qix

+0

'Список list = new ArrayList ();' 95% раз нет причин объявлять переменную как ArrayList, List достаточно. –

+0

Конечно. Однако в вашем ответе это не указано. Кроме того, типы в конструкции родовых классов не приветствуются в Java7. – Qix

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