@@ -69,7 +69,7 @@ public static Class<?>[] collectTypes(final Object[] objects) {
6969 final Class <?>[] types = new Class <?>[objects .length ];
7070 for (int i = 0 ; i < objects .length ; i ++) {
7171 final Object o = objects [i ];
72- types [i ] = o != null ? o .getClass () : Object . class ;
72+ types [i ] = o != null ? o .getClass () : null ;
7373 }
7474 return types ;
7575 }
@@ -81,7 +81,7 @@ public static boolean isTypeListCompatible(Class<?>[] inputTypeList, Class<?>[]
8181 for (Class <?>[] derivableTypeList : derivableTypeLists ) {
8282 boolean currentTypeListCompatible = true ;
8383 for (int i = 0 ; i < derivableTypeList .length && currentTypeListCompatible ; i ++) {
84- if (!derivableTypeList [i ].equals (targetTypeList [i ])) {
84+ if (derivableTypeList [ i ] != null && !derivableTypeList [i ].equals (targetTypeList [i ])) {
8585 currentTypeListCompatible = false ;
8686 }
8787 }
@@ -137,47 +137,49 @@ private static List<Class<?>[]> generateCompatibleTypeLists(final int index, fin
137137 // 1. don't generate compatible list; just try the normal type first
138138 // remember, in combinations types should be allowed to be converted)
139139 generateCompatibleTypeLists (index + 1 , lookupMode , compatibleTypeLists , inputTypelist .clone ());
140-
141- // 2. generate type in which the original can be (un)wrapped
142- if (lookupMode .contains (LookupMode .AUTOBOX ) && !lookupMode .contains (LookupMode .SMART_CONVERT )) {
143- final Class <?> autoboxed = autobox (original );
144- if (autoboxed != null ) {
145- final Class <?>[] newTypeList = replaceInArray (inputTypelist .clone (), index , autoboxed );
146- generateCompatibleTypeLists (index + 1 , lookupMode , compatibleTypeLists , newTypeList );
140+
141+ if (original != null ) {
142+ // 2. generate type in which the original can be (un)wrapped
143+ if (lookupMode .contains (LookupMode .AUTOBOX ) && !lookupMode .contains (LookupMode .SMART_CONVERT )) {
144+ final Class <?> autoboxed = autobox (original );
145+ if (autoboxed != null ) {
146+ final Class <?>[] newTypeList = replaceInArray (inputTypelist .clone (), index , autoboxed );
147+ generateCompatibleTypeLists (index + 1 , lookupMode , compatibleTypeLists , newTypeList );
148+ }
147149 }
148- }
149-
150- // autocast to supertype or interface?
151- if ( lookupMode . contains ( LookupMode . CAST_TO_INTERFACE )) {
152- // 3. generate implemented interfaces the original value could be converted (cast) into
153- for ( final Class <?> iface : original . getInterfaces ()) {
154- final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , iface );
155- generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
150+
151+ // autocast to supertype or interface?
152+ if ( lookupMode . contains ( LookupMode . CAST_TO_INTERFACE )) {
153+ // 3. generate implemented interfaces the original value could be converted (cast) into
154+ for ( final Class <?> iface : original . getInterfaces ()) {
155+ final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , iface );
156+ generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
157+ }
156158 }
157- }
158-
159- if ( lookupMode . contains ( LookupMode . CAST_TO_SUPER )) {
160- // 4. generate supertypes the original value could be converted (cast) into
161- Class <?> supertype = original ;
162- while (( supertype = supertype . getSuperclass ()) != null ) {
163- final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , supertype );
164- generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
159+
160+ if ( lookupMode . contains ( LookupMode . CAST_TO_SUPER )) {
161+ // 4. generate supertypes the original value could be converted (cast) into
162+ Class <?> supertype = original ;
163+ while (( supertype = supertype . getSuperclass ()) != null ) {
164+ final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , supertype );
165+ generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
166+ }
165167 }
166- }
167-
168- // 5. generate types the original value could be converted into
169- if ( lookupMode . contains ( LookupMode . COMMON_CONVERT ) && ! lookupMode . contains ( LookupMode . SMART_CONVERT )) {
170- for ( final Class <?> convert : collectRegisteredCompatibleTargetTypes ( original )) {
171- final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , convert );
172- generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
168+
169+ // 5. generate types the original value could be converted into
170+ if ( lookupMode . contains ( LookupMode . COMMON_CONVERT ) && ! lookupMode . contains ( LookupMode . SMART_CONVERT )) {
171+ for ( final Class <?> convert : collectRegisteredCompatibleTargetTypes ( original )) {
172+ final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , convert );
173+ generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
174+ }
173175 }
174- }
175-
176- // 6. generate types the original value could be converted into with intermediary conversions
177- if ( lookupMode . contains ( LookupMode . SMART_CONVERT )) {
178- for ( final Class <?> convert : collectCompatibleTargetTypes ( original )) {
179- final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , convert );
180- generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
176+
177+ // 6. generate types the original value could be converted into with intermediary conversions
178+ if ( lookupMode . contains ( LookupMode . SMART_CONVERT )) {
179+ for ( final Class <?> convert : collectCompatibleTargetTypes ( original )) {
180+ final Class <?>[] newTypeList = replaceInArray ( inputTypelist . clone (), index , convert );
181+ generateCompatibleTypeLists ( index + 1 , lookupMode , compatibleTypeLists , newTypeList );
182+ }
181183 }
182184 }
183185 }
0 commit comments