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