List
包含对象类型,但我需要检查该对象是A
还是B
:
A a = new A();
B b = new B();
List<A> aL = new ArrayList<A>();
List<B> bL = new ArrayList<B>();
如何检查List
是否包含A
个对象或B
个对象?
以下是代码:
SegmentDetailInfo segmentDetailInfo = new SegmentDetailInfo();
segmentDetailInfo.setSeg_Id("1");
SegReqInfoBean segReqInfoBean = new SegReqInfoBean();
segReqInfoBean.setPageName("homepage");
List<SegmentDetailInfo> rhsList1 = new ArrayList<SegmentDetailInfo>();
rhsList1.add(segmentDetailInfo);
List<SegReqInfoBean> rhsList2 = new ArrayList<SegReqInfoBean>();
rhsList2.add(segReqInfoBean);
doProspecListCompareCheck(rhsList1);
doProspecListCompareCheck(rhsList2);
}
private static void doProspecListCompareCheck(Object rhsList) {
if (rhsList instanceof List<SegmentDetailInfo>) //wrong Check
//DoTHIS
else if(rhsList instanceof List<SegReqInfoBean>) //wrong Check
//Do THIS
}
=============================================== =========
SegmentDetailInfo segmentDetailInfo = new SegmentDetailInfo();
segmentDetailInfo.setSeg_Id("1");
SegReqInfoBean segReqInfoBean1 = new SegReqInfoBean();
segReqInfoBean1.setPageName("Home");
List<SegmentDetailInfo> rhsList1 = new ArrayList<SegmentDetailInfo>();
rhsList1.add(segmentDetailInfo);
List<SegReqInfoBean> rhsList2 = new ArrayList<SegReqInfoBean>();
rhsList2.add(segReqInfoBean1);
String Homepage="homepage";
doProspecListCompareCheck(Homepage);
doProspecListCompareCheck(rhsList2);
doProspecListCompareCheck(rhsList2);
private static void doProspecListCompareCheck(Object rhsListObj) {
List<String> rhsStrList = new ArrayList<String>();
List<SegReqInfoBean> segReqInfoBeanList = new ArrayList<SegReqInfoBean>();
List<SegmentDetailInfo> segmentDetailInfoList = new ArrayList<SegmentDetailInfo>();
if (rhsListObj != null && rhsListObj instanceof List) {
if (((List<SegmentDetailInfo>) rhsListObj).get(0) instanceof SegmentDetailInfo){
System.out.println("SegmentDetailInfo loading");
segmentDetailInfoList = (List<SegmentDetailInfo>) rhsListObj;
}
else if(((List<SegReqInfoBean>) rhsListObj).get(0) instanceof SegReqInfoBean){
System.out.println("SegReqInfoBean loading");
segReqInfoBeanList = (List<SegReqInfoBean>) rhsListObj;
}
}else if ( rhsListObj != null && rhsListObj instanceof String) {
rhsStrList.add(rhsListObj.toString());
}
}
答案 0 :(得分:14)
您可以通过比较Object
内的第一个List
来实现此目的:
private static void doProspecListCompareCheck(List rhsList)
{
if(rhsList != null && !rhsList.isEmpty())
{
if (rhsList.get(0) instanceof SegReqInfoBean)
{
}
else if(rhsList.get(0) instanceof SegmentDetailInfo)
{
}
}
}
答案 1 :(得分:4)
泛型仅提供编译时检查。在运行时,它们完全消失了。这被称为类型擦除。因此,在运行时,您的代码如下所示:
List rhsList1 = new ArrayList();
rhsList1.add(segmentDetailInfo);
List rhsList2 = new ArrayList();
rhsList2.add(segReqInfoBean);
doProspecListCompareCheck(rhsList1);
doProspecListCompareCheck(rhsList2);
}
private static void doProspecListCompareCheck(Object rhsList) {
if (rhsList instanceof List) //wrong Check
//DoTHIS
else if(rhsList instanceof List) //wrong Check
//Do THIS
}
用通用参数区分两个通用对象根本不是你可以用Java做的事情。
答案 2 :(得分:0)
如果您知道列表非空,则可以执行rhsList.get(0)instanceof SegReqInfobean
如果列表可能为空,则可以从插入正确类型的对象开始,然后记住索引0存储虚拟对象,因此在处理之前将其删除(或者只是在索引0处开始处理列表)。泛型只是编译时的便利。您不能在运行时使用泛型类型。
答案 3 :(得分:0)
for (Object aList : list) {
Class cls = aList.getClass();
System.out.println("The type of the object is: " + cls.getName());
}
这似乎对我有用。这不仅将检测是否有任何索引是A或B类型,而且还会检测每种类型。