Reputation: 359
List
contains the object type, but I need to check if that object is of type A
or B
:
A a = new A();
B b = new B();
List<A> aL = new ArrayList<A>();
List<B> bL = new ArrayList<B>();
How can I check whether List
contains A
objects or B
objects?
Here is the code:
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());
}
}
Upvotes: 23
Views: 49074
Reputation: 71
for (Object aList : list) {
Class cls = aList.getClass();
System.out.println("The type of the object is: " + cls.getName());
}
This seems to work for me. This will not only detect if any index is of type A or B, but detects every type.
Upvotes: 1
Reputation: 4057
If you know the list is non-empty you can do rhsList.get(0) instanceof SegReqInfobean
If the list may be empty you could start by inserting an object of the correct type and then remember that index 0 stores a dummy object, so remove it before processing (or just start processing the list at index 0). Generics are just a compile time convenience. You can't use the generic type at runtime as you discovered.
Upvotes: 2
Reputation: 8771
One way you can do it is by comparing first Object
inside the 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)
{
}
}
}
Upvotes: 27
Reputation: 6717
Generics only provide compile-time checks. At runtime, they are completely gone. This is known as type erasure. So at runtime, your code looks like this:
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
}
Distinguishing two generic objects by their generic parameter is simply not something you can do in Java.
Upvotes: 10