Check which type of object list <?> Contains

List contains the type of the object, but I need to check if this 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 to check if List objects contain A 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()); } } 
+8
java generics
source share
3 answers

One way to do this is to first compare the 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) { } } } 
+13
source share

Generics provides only compile-time checks. At runtime, they completely disappeared. This is called 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 } 

The difference between two common objects from their common parameter is simply not what you can do in Java.

+3
source share

If you know that the list is not empty, you can do rhsList.get (0) instanceof SegReqInfobean

If the list can be empty, you can start by entering an object with the correct type, and then remember that index 0 stores a dummy object, so delete it before processing (or just start processing the list with index 0). Generics are just a compilation convenience. You cannot use the generic type at runtime as you discovered.

0
source share

All Articles