标题可能令人困惑,但我会尝试用以下示例解释它。
我定义了两种不同类型的类,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
我该如何解决这个问题?
答案 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
.....
}