2015-09-15 2 views
1

Я собираюсь сделать метод, возвращающее ArrayList множественного объекта, как это:Как вернуть arraylist из нескольких классов в Java?

public ArrayList<Object> getData(Object similar) { 

    //I suppose that I have 2 ArrayList that already contain data here 
    ArrayList<Human> humans = new ArrayList<Human>(); 
    ArrayList<Animal> animals = new ArrayList<Animal>(); 

    if (similar.getClass().equals(Human.class)) { 
     return humans; 
    } 

    if (similar.getClass().equals(Animal.class)) { 
     return animals; 
    } 

    return null; 
} 

Моей идея проверить тип объекта пар, если это Человеческий класс затем вернуться ArrayList человека. Но я не могу так вернуться из-за несовместимого типа.
Проблема заключается в том, что объект возврата не является конкретным.
Как это исправить? Спасибо!

ответ

1

Я не уверен, почему вы бы, шаблон завод звучит как лучшая идея, но может быть что-то вроде ...

И тогда вы должны быть в состоянии использовать что-то вроде

ArrayList<Human> humans = getData(new Human()); 
ArrayList<Animal> animals = getData(new Animal()); 

назвать

в зависимости от того, насколько строги вы хотите быть, вы могли бы использовать что-то вроде ...

if (Human.class.isInstance(similar)) { 

, который позволит вам захватить суб-классы от Human

Ко мне, однако, это не имеет никакого смысла. Ваш метод должен четко определить, что он хочет сделать. Может быть, вместо того, чтобы пытаться использовать один метод для возврата данных для нескольких классов, возможно, вам следует рассмотреть возможность использования шаблона фабрики, к примеру ...

public abstract class AbstractFactory<T> { 
    public abstract List<T> getData(); 
} 

public class HumanFactory extends AbstractFactory<Human>{ 

    @Override 
    public List<Human> getData() { 
     return new ArrayList<>(); // Or what ever data you need it filled with 
    } 

} 

public class AnimalFactory extends AbstractFactory<Animal>{ 

    @Override 
    public List<Animal> getData() { 
     return new ArrayList<>(); // Or what ever data you need it filled with 
    } 

} 
+0

ArrayList people = getData (new Human()); глупо; если он знает, что он хочет, и ArrayList , он может просто использовать ArrayList people = new ArrayList () –

+0

@DarkSquirtings Duh, я просто последовал за тем, с чего начинался OP, как я уже сказал, я бы просто использовал шаблон фабрики если я действительно был заинтересован – MadProgrammer

1

Я не уверен, если это то, что вы ищете но если я понимаю, что вы пытаетесь сделать правильно, это должно сработать.

Вы можете упростить то, что вы делаете с помощью дженериков

public ArrayList<T> getData(T similar) { 
    return new ArrayList<T>(); 
} 

Это возвращает ArrayList любого типа вы передаете в функцию.

+0

Как это улучшение по сравнению с просто вызовом нового ArrayList ()? Он не может назвать метод, не зная класса. –

0

В этом случае проблема: если в определении вашего метода указано, что вы возвращаете ArrayList<Object>, тогда вызывающий абонент ожидает получить ArrayList<Object>. ArrayList<Human> более ограничен в том, что может быть размещено в нем, и поэтому не выполняет контракт, установленный в определении класса.

Кроме того, если вы не знаете, какой класс объект, который вы передаете методу создания ArrayList, находится во время компиляции, то вы не будете знать, какой тип ArrayList вы получаете, так что даже если бы ваш метод работал, это не принесло бы вам пользы.

Я не уверен, что вы пытаетесь сделать, но первый шаг, вероятно, чтобы убедиться, что вы не просто пытается сконструировать более сложный способ использования ArrayList<Human> myList = new ArrayList<Human>();

0

Здесь вы используйте generic методы! Вы должны изменить свой код на это:

public <T> ArrayList<T> getData (T similar) { 
    return new ArrayList<T>(); 
} 

Но это действительно не имеет смысла. Потому что зачем вам нужен метод для создания ArrayList?Вы можете просто создать один из любого типа вы хотите, как это:

ArrayList<WhateverTypeYouLike> = new ArrayList<>(); 

Но если вы действительно хотите сделать это, вот еще информация по общим методам:

https://docs.oracle.com/javase/tutorial/extra/generics/methods.html

+0

Я знаю, как создать ArrayList, но это не то, о чем я прошу. Мой метод получает тип param, зависит от него, я знаю, что я должен вернуть. Я отредактировал мой вопрос, я надеюсь, что это более ясно! –

+0

Но зачем вам это нужно? Если вы можете передать объект методу, вы должны знать его тип. Это означает, что вы можете просто создать список массивов, используя тип объекта. Нет необходимости писать метод. Это домашнее задание или что-то еще? @NgoKimHuynh – Sweeper

+0

Я знаю, что могу сделать 2 метода, которые возвращают ArrayList и ArrayList . Но если моя идея возможна, мне не нужно писать 2 раза. –

0

You» re код не компилируется, потому что ArrayList<Human> is не a подтип ArrayList<Object>. С массивами это другое. Human[] является подтипом Object[]. Причиной этого является предотвращение ошибок времени выполнения с использованием системы типов. Если you'r код компилируется абонент может выполнить следующие действия:

ArrayList<Object> aList = getData(new Human()); 
list.add("some String"); 

В конце концов, aList должен содержать произвольные Object с, поэтому это компилирует. Если вы делаете это с помощью массивов. Вы получаете ArrayStoreException при добавлении String.

Что можно сделать по этому поводу? Это зависит от ваших требований. Но, вероятно, код, представленный @Sweeeper и @FrozenHawk должны работать для вас:

public <T> ArrayList<T> getData (T similar) { 
    return new ArrayList<T>(); 
} 

Если это не ваше намерение, пожалуйста, спросите в комментариях. Для этого есть больше шаблонов.

+0

Я отредактировал мой вопрос, я надеюсь, что это более ясно! –