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

时间:2015-02-17 19:46:36

标签: java class arraylist

标题可能令人困惑,但我会尝试用以下示例解释它。

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

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

......

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

使用哪个类取决于用户输入。例如,对于condition1,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) {
       .....
    }
}

我可以有一个可以代表任何一种类型的假类(Marker)吗?类似的东西:

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

ArrayList<Marker> markers = new ArrayList<Marker>();
for (Marker marker : markers) {
       .....
}

编辑: 看起来界面是要走的路。问题是CDMarker / PDLMarker列表的创建是通过以下方法完成的:

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;
}

现在我在第List<Marker> markers = writePDLMarker(sheet, dir);行说错了 此行有多个标记      - 类型不匹配:无法从列表转换为列表      - 类型不匹配:无法从ArrayList转换为List

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

创建以下类和接口:

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;
}

答案 1 :(得分:0)

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

编辑:这是我发现的一个简单例子。 http://examples.javacodegeeks.com/java-basics/java-inheritance-example/

答案 2 :(得分:0)

你可以让CDMarker和PDLMarker扩展相同的超级标记。然后将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
       .....
}