如何在Java中创建可以表示两种不同类型的对象类型

如何在Java中创建可以表示两种不同类型的对象类型,java,class,arraylist,Java,Class,Arraylist,标题可能令人困惑,但我将尝试用下面的例子来解释它 我定义了两种不同类型的类,CDMarker和PDLMarker。在如下所示的处理方法中,我为其中一种类型创建了一个arraylist,并使用foreach循环来分析它们中的每一种 ArrayList<CDMarker> cdMarkers = new ArrayList<CDMarker>(); ...... for (CDMarker marker : cdMarkers) { ..... } ArrayLi

标题可能令人困惑,但我将尝试用下面的例子来解释它

我定义了两种不同类型的类,CDMarker和PDLMarker。在如下所示的处理方法中,我为其中一种类型创建了一个arraylist,并使用foreach循环来分析它们中的每一种

ArrayList<CDMarker> cdMarkers = new ArrayList<CDMarker>();

......

for (CDMarker marker : cdMarkers) {
   .....
}
ArrayList cdMarkers=new ArrayList();
......
用于(CDMarker标记:cdMarkers){
.....
}
使用哪个类取决于用户输入。例如,对于条件1,CDMarker是要使用的类型。条件2,PDLMarker

而不是像这样的代码:

if condition1
{
    ArrayList<CDMarker> cdMarkers = new ArrayList<CDMarker>();

    ......

    for (CDMarker marker : cdMarkers) {
       .....
    }
}

if condition2
{
    ArrayList<PDLMarker> pdlMarkers = new ArrayList<PDLMarker>();

    ......

    for (PDLMarker marker : pdlMarkers) {
       .....
    }
}
如果条件1
{
ArrayList cdMarkers=新的ArrayList();
......
用于(CDMarker标记:cdMarkers){
.....
}
}
如果条件2
{
ArrayList pdlMarkers=新的ArrayList();
......
用于(PDLMarker标记器:PDLMarker){
.....
}
}
我可以有一个可以代表任何一种类型的假类(标记)吗?比如:

if condition1
    Marker = CDMarker;
if condition2
    Marker = PDLMarker;

ArrayList<Marker> markers = new ArrayList<Marker>();
for (Marker marker : markers) {
       .....
}
如果条件1
Marker=CDMarker;
如果条件2
标记器=PDL标记器;
ArrayList markers=新的ArrayList();
用于(标记:标记){
.....
}
编辑: 看来界面是最好的选择。问题在于CDMarker/PDLMaker列表的创建是通过以下方法完成的:

if condition1
    List<Marker> markers = writeCDMarker(sheet, dir);
if condition2
    List<Marker> markers = writePDLMarker(sheet, dir);

public static List<PDLMarker> writePDLMarker(HSSFSheet sheet, File dir) {
    List<PDLMarker> pdlMarkers = new ArrayList<PDLMarker>();
    ....
    return pdlMarkers;
}

public static List<CDMarker> writeCDMarker(HSSFSheet sheet, File dir) {
    List<CDMarker> cdMarkers = new ArrayList<CDMarker>();
    ....
    return cdMarkers;
}
如果条件1
列表标记=writeCDMarker(表,目录);
如果条件2
列表标记=writePDLMarker(工作表,目录);
公共静态列表写入标记(HSSF表,文件目录){
List pdlMarkers=new ArrayList();
....
返回PDL标记器;
}
公共静态列表写入标记(HSSF表,文件目录){
List cdMarkers=new ArrayList();
....
返回CDR标记;
}
现在我在第
List markers=writePDLMarker(sheet,dir)行得到一个错误说
这条线上有多个标记
-类型不匹配:无法从列表转换为列表
-类型不匹配:无法从ArrayList转换为List


如何修复此问题?

是的,创建一个marker类,并让CDMarker和PDLMarker从该类继承。然后可以按列出的方式循环遍历所有标记对象


编辑:这是我发现的一个简单的例子

您可以让CDMarker和pdlmaker扩展同一个超类标记。然后将ArrayList声明为超类ArrayList,然后循环。在循环中,可以使用不同的条件来调用对象上的不同方法

Marker marker1;                 //declare as superclass
if condition1
    marker1 = new CDMarker();   //assign to subclass object as needed
if condition2
    marker1 = new PDLMarker();  //assign to subclass object as needed

ArrayList<Marker> markers = new ArrayList<Marker>();
markers.add(marker1);           //add to subclass Arraylist
for (Marker marker : markers) { //loop through subclass Arraylist
       .....
}
Marker-marker1//声明为超类
如果条件1
marker1=新的CDMarker()//根据需要指定给子类对象
如果条件2
marker1=新的PDLMarker()//根据需要指定给子类对象
ArrayList markers=新的ArrayList();
标记。添加(标记1)//添加到子类Arraylist
for(Marker:markers){//通过子类Arraylist循环
.....
}

创建以下类和接口:

public interface Marker {
}

public class CDMarker implements Marker {
    ...
}

public class PDLMarker implements Marker {
    ...
}
按以下方式使用它们:

//Create list
List<Marker> markers = new ArrayList<Marker>();

//Add objects
if(condition1)
    markers.add(new CDMarker());
else if(condition2)
    markers.add(new PDLMarker());

//Access elements
for(Marker m : markers) {
    if(m instanceof CDMarker)
        CDMarker cdMarker = (CDMarker)m;
    else if(m instanceof PDLMarker)
        PDLMarker pdlMarker = (PDLMarker)m;
}
//创建列表
列表标记=新的ArrayList();
//添加对象
如果(条件1)
添加(新的CDMarker());
否则如果(条件2)
添加(新的PDLMarker());
//访问元素
用于(标记m:标记){
if(CDMarker的m实例)
CDMarker-CDMarker=(CDMarker)m;
else if(PDLMarker的m实例)
PDLMarker PDLMarker=(PDLMarker)m;
}

如果让它们共享同一个超类,则可以使用。然后,ArrayList的泛型应该包含该超类和bam。标记不必是类,接口就足够了。也就是说,如果两个类(CDMaker和PDLMaker)中的方法声明相同。如果我让CDMarker从类Marker继承,那么
Marker=CDMarker
correct语句是否正确?@Nas:它将带有关键字new:Marker a=new-CDMarker();