2016-05-18 3 views
4

Я хочу создать собственный класс MultipleResult, который может содержать ArrayList s разных типов, но я не уверен, как это реализовать. Я хочу инкапсулировать несколько ArrayList в один объект, но иногда я буду использовать ArrayList<Float> и другие времена ArrayList<Integer>. Я попытался объявить общий вход как ArrayList<Object>, но это дает мне incompatible types ошибку, когда я делаю:ArrayList, содержащий произвольные объекты

MultipleResult arrays = reduce(theInputValues,10); 
ArrayList<Float> arrayA =arrays.getResultA(); 

где метод reduce генерирует несколько ArrayList<Float> и помещает их в MultipleResult объект. Это MultipleResult класс:

import java.util.ArrayList; 

public class MultipleResult { 

    private ArrayList<Object> resultA; 
    private ArrayList<Object> resultB; 
    private ArrayList<Object> resultC; 
    private ArrayList<Object> resultD; 

    public MultipleResult(ArrayList<Object> arrayA, ArrayList<Object> arrayB) { 
     resultA=arrayA; 
     resultB=arrayB; 
    } 

    public MultipleResult(ArrayList<Object> arrayA, ArrayList<Object> arrayB, 
          ArrayList<Object> arrayC, ArrayList<Object> arrayD) { 
     resultA=arrayA; 
     resultB=arrayB; 
     resultC=arrayC; 
     resultD=arrayD; 
    } 

    public ArrayList<Object> getResultA() { 
     return resultA; 
    } 

    public ArrayList<Object> getResultB() { 
     return resultB; 
    } 

    public ArrayList<Object> getResultC() { 
     return resultC; 
    } 

    public ArrayList<Object> getResultD() { 
     return resultD; 
    } 
} 

А вот reduce метод:

private MultipleResult reduce(ArrayList<Float> theInput,Integer n){ 

    ArrayList<Float> opens=new ArrayList<>(); 
    ArrayList<Float> highs=new ArrayList<>(); 
    ArrayList<Float> lows=new ArrayList<>(); 
    ArrayList<Float> closes=new ArrayList<>(); 

    Integer N = theInput.size(); 

    for (int i=0;i<n;i++){ 

     Integer nMin = Math.round((N/n)*i); 
     Integer nMax = Math.round((N/n)*(i+1))-1; 

     Float open=theInput.get(nMax); 
     Float high=theInput.get(nMin); 
     Float low=theInput.get(nMin); 
     Float close=theInput.get(nMin); 

     for(int j=nMin;j<=nMax;j++){ 
      if (theInput.get(j)>high){ 
       high=theInput.get(j); 
      } 
      if (theInput.get(j)<low){ 
       low=theInput.get(j); 
      } 
     } 

     opens.add(i,open); 
     highs.add(i,high); 
     lows.add(i,low); 
     closes.add(i,close); 

    } 

    return new MultipleResult(opens,highs,lows,closes); 
} 
+1

TL; DR Вы можете попробовать использовать 'Number'. – Mena

+3

Или, может быть, [** Общие типы **] (https://docs.oracle.com/javase/tutorial/java/generics/types.html) – Kaostias

ответ

4

Как было предложено в комментарии по @Kaostias вы можете сделать MultipleResultgeneric следующим

public class MultipleResult<T> { 

    private ArrayList<T> resultA; 
    private ArrayList<T> resultB; 
    private ArrayList<T> resultC; 
    private ArrayList<T> resultD; 

    public MultipleResult(ArrayList<T> arrayA, ArrayList<T> arrayB) { 
     resultA=arrayA; 
     resultB=arrayB; 
    } 

    public MultipleResult(ArrayList<T> arrayA, ArrayList<T> arrayB, 
          ArrayList<T> arrayC, ArrayList<T> arrayD) { 
     resultA=arrayA; 
     resultB=arrayB; 
     resultC=arrayC; 
     resultD=arrayD; 
    } 

    public ArrayList<T> getResultA() { 
     return resultA; 
    } 

    public ArrayList<T> getResultB() { 
     return resultB; 
    } 

    public ArrayList<T> getResultC() { 
     return resultC; 
    } 

    public ArrayList<T> getResultD() { 
     return resultD; 
    } 
} 

и использование это следующим образом:

private MultipleResult<Float> reduce(ArrayList<Float> theInput,Integer n){ 

    ArrayList<Float> opens=new ArrayList<>(); 
    ArrayList<Float> highs=new ArrayList<>(); 
    ArrayList<Float> lows=new ArrayList<>(); 
    ArrayList<Float> closes=new ArrayList<>(); 

    Integer N = theInput.size(); 

    for (int i=0;i<n;i++){ 

     Integer nMin = Math.round((N/n)*i); 
     Integer nMax = Math.round((N/n)*(i+1))-1; 

     Float open=theInput.get(nMax); 
     Float high=theInput.get(nMin); 
     Float low=theInput.get(nMin); 
     Float close=theInput.get(nMin); 

     for(int j=nMin;j<=nMax;j++){ 
      if (theInput.get(j)>high){ 
       high=theInput.get(j); 
      } 
      if (theInput.get(j)<low){ 
       low=theInput.get(j); 
      } 
     } 

     opens.add(i,open); 
     highs.add(i,high); 
     lows.add(i,low); 
     closes.add(i,close); 

    } 

    return new MultipleResult<Float>(opens,highs,lows,closes); 
} 
0

Вы можете сделать это с помощью дженериков. Например:

public class MultipleResult<T> { 
    ... 
    } 

, а затем:

MultipleResult<Integer> multipleResult = new MultipleResult<>(); 
0

Вы можете сделать себя MultipleResult параметрический, используя что параметрический тип, чтобы ввести его содержимое массивов.

public class MultipleResult<T extends Number> { 
    private List<T> resultA = new ArrayList<>(); 

    public MultipleResult(List<T> arrayA, ...) { 
     this.resultA = arrayA; 
    } 
}