我有这段代码:
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<?>
?请让我知道这个概念吗?
答案 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
是抽象class
或A
由B
和type 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应该有另一个父类,而不是超类(对象),如果没有,你最好不要把不同的类放在同一个列表中。