雜記...
Eclipse:
- Enable jdk 5 compliance mode: window -> preferences -> java -> compiler -> Compiler compliance Level -> 5.0
- refactoring old code to generic:
//Old code: List l = new ArrayList(); for (Iterator iter = l.iterator(); iter.hasNext();) { String element = (String) iter.next(); } //change to: List<String> l = new ArrayList(); for (Iterator iter = l.iterator(); iter.hasNext();) { String element = (String) iter.next(); }
then select eclipse menu: "Refactor -> Infer Generic Type Arguments", eclipse will do rest for you:
List<String> l = new ArrayList<String>(); for (Iterator<String> iter = l.iterator(); iter.hasNext();) { String element = iter.next(); }
Ant:
- Enable jdk5 mode for javac task:
<javac source="1.5" > ...
Generic:
- Erasure -- Generic type information will be "erased" after compile (ByteCode does not contain any type information, hence we can not do reflection on generic type)
- Due to above reason, we can not cast generic type:
List<Integer> ints = new LinkedList<Integer>(); List<Number> nums = ints; // compile error.
- Thus, we need to use wildcard <?> to support more types, however, <?> is a read-only type:
List<?> list = new ArrayList(); // image ? is a "unknown" type list.get() ; // return unknown type, here is Object list.add("1"); // compile error, add() method can not process unknown type.
- Considering wildcard <?> is a kind of concrete type, just like <Integer>,<String>...etc. It's not type for declaration
- static variable is not allowed to declared with generic type
//compile error, because static variable is shared for all instances. But every instance //has its own generic type. private static List<T> staticList = new ArrayList<T>();
Enum:
- Enum can not do subclass, but can implement interface.
- Always use .name() instead of .toString() to determine Enum.
- Mapping Enum as a value type in Hibernate: Enum CustomUserType
- Hibernate Customed Enum Type with join-table (many-to-many for Enum)
<typedef name="Gender" class="GenericEnumUserType"> <param name="enumClass">Gender</param> </typedef> <set name="genders" table="room_genders" > <key column="room_id" /> <element type="Gender" column="gender" /> </set>
Mystery bug from autoboxing/unboxing:
- Null
Integer i = null ; int j = i ; //throw NullPointException
- Object Identity
Integer i1 = 256 ; Integer i2 = 256 ; assertFalse(i1 == i2) ; // not always true Integer i3 = 90 ; Integer i4 = 90 ; assertTrue(i3 == i4) ; // sun jdk implementation reuse Integer instance within -128~127
繼續學...