如何将不同的类传递给相同的ArrayList<>在构造函数中

时间:2016-06-20 11:27:46

标签: java android arraylist constructor

我有这段代码:

class A{
  String a1;
  String a2;
  getters / setters for a1, a2
}

public class B{
  String b1;
  getters/setters for b1
}

在另一个类C中,我将此类用于ArrayList<A>ArrayList<B>并将此ArrayList传递给D类构造函数:

public class D {
  ArrayList<A or B> arraylist;

  public D(ArrayList<A or B> arraylist){
    this.arraylist = arraylist;
   }
 } 

现在请帮助我如何将pojo类传递给我需要的类型的构造函数ArrayList<?>?请让我知道这个概念吗?

4 个答案:

答案 0 :(得分:1)

ArrayLists只能在特定类型(或完全非特定的通配符)上构建。 &#34; A或B&#34;根本没有用。

但是你正在寻找的概念被称为SOLID ......实质上是:做适当的OO设计。因为这通常有助于完全解决这种情况。

在您的情况下:如果您的课程应该提供相同的行为,那么最好的方法是定义某个界面,例如

interface StringProvider {
  String getFirstValue(); 
  String getSecondValue();

A和B实现该接口;这样你就可以写下来了:

ArrayList<StringProvider> 

然后将As或Bs,甚至两个类的对象添加到该列表中。

并提示:你甚至想要调查你的设计,以了解为什么你需要不同的课程,这些课程一方面非常相似,但另一方面又值得为他们设置不同的课程。

答案 1 :(得分:0)

你不能ArrayList<A or B> - 它是violation of Java principles,因为容器的泛化必须保证所有包含对象的单一界面。

ArrayList<SuperClass> SuperClass interface是抽象classABtype bit2_t is array (0 to 1) of bit; type record0 is record bit2 : bit2_t; end record; 类实现/扩展的bit2_t

答案 2 :(得分:0)

我看到两个选项,

选项号1使A和B共享公共接口。

然后您可以将您的班级定义为

class D<T extends SharedInterface>{
  List<T> list;
 }

但是,为此,您需要更改一些现有代码,这并非总是可行。

所以这里是选项2。 创建转换器接口

interface Converter<S,T> {
T convert(S source);
}

将Converter添加到您的D

class D<T extends SharedInterface>{
      List<T> list;
      Converter<T,String> converter;
     }

现在,当你想要访问你的价值时,你会做

converter.convert(list.get(position));

或者您可以使用D类中需要的方法创建抽象适配器,并为A和B创建适配器,然后转换列表,并将它们传递给D.

答案 3 :(得分:0)

D类:

@Value

C类:

PropertySourcesPlaceholderConfigurer

结果:

import java.util.ArrayList;
public class D{
  ArrayList<Object> arraylist;

 public D(ArrayList<Object> arraylist){
       this.arraylist = arraylist;
   }
 } 

我认为A和B应该有另一个父类,而不是超类(对象),如果没有,你最好不要把不同的类放在同一个列表中。