does seam ignore generics in lists?
binabik Sep 5, 2007 1:58 PMhi all,
following _very_ strange behaviour:
in a SFSB i have 3 lists defined as follows:
[...] @Out (required=false) private List<TimetableItem> bscLectures; @Out (required=false) private List<TimetableItem> bscPracticals; private List<TimetableItem> selectedBscLectures; [...]
in a .xhtml file:
<h:selectManyCheckbox id="lectureBscList" value="#{timetable.selectedBscLectures}" layout="pageDirection"> <s:selectItems value="#{timetable.bscLectures}" var="lecture" label="#{lecture.title} (#{lecture.type}): #{lecture.times}" /> </h:selectManyCheckbox> [...] <h:dataTable id="bscPracticalList" var="bscPr" value="#{timetable.bscPracticals}" rendered="#{not empty timetable.bscPracticals}"> <h:column> #{bscPr.title} </h:column> <h:column> <h:selectOneMenu value="#{bscPr.selected}"> <s:selectItems value="#{bscPr.times}" var="n" label="#{n.toShortString()}" noSelectionLabel="Please select..."/> </h:selectOneMenu> </h:column> </h:dataTable>
TimetableItem is not an Entity Bean, it's a helper class i've mashed together, with the following fields:
private String title; private String type; private List<TimetableItemTime> times; private Object selected; // this should be a TimetableItem as well
i realised that i've got some problems somewhere when i tried the following:
for (TimetableItem t : this.selectedBscLectures) System.out.println(t.toString())); // changed for ease of reading
and it was giving me ClassCastExceptions. The SelectOneMenu's were doing the same thing on TimetableItem.selected, which is why i changed that to an Object. After investigating further, i found out that my List selectedBscLectures is actually populated with Strings.
2 questions:
1.) why strings?
2.) why isn't the JVM screaming loudly about violations of the Generics?
[i may have an answer for 2.):]
constructs like this aren't caught by the java compiler, but do cause ClassCastExceptions at runtime.
import java.util.*; public class Test { public static void main(String args[]) { ArrayList<Integer> integerList = new ArrayList<Integer>(); integerList.add(1); Object o = new String("Simon!"); integerList.add((Integer)o); } }
now the interesting question is, where are the ClassCastExceptions which should be happening going? they're not in my server log...
[possible answer to 1.): i'm assuming because my beans aren't @Entity's, they have no @Id, which means that the JVM is using the toString() to identify them (the value of checkbox is a string representation of the object), and passing this into the Lists. but how do i avoid this?]
regards,
sb