// Can a be converted to b? // score 0 = exact match // score Int.MAX_VALUE = no match // score 1 = conversion needed (boxing/unboxing or non-primitve widening) // score -2 = primitive widening needed static int typeConversionScore(Class a, Class b) { if (a == b) ret 0; if (b.isPrimitive()) { // target type is primitive if (a.isPrimitive()) { // both types are primitive // No widenings to bool if (b == bool.class) ret Int.MAX_VALUE; // No widenings to byte if (b == byte.class) ret Int.MAX_VALUE; // byte can be converted to char if (b == char.class) ret a == byte.class ? -2 : Int.MAX_VALUE; // byte can be converted to short if (b == short.class) ret a == byte.class ? -2 : Int.MAX_VALUE; // byte, char and short can be converted to int if (b == int.class) ret a == byte.class || a == char.class || a == short.class ? -2 : Int.MAX_VALUE; // byte, char, short and int can be converted to long if (b == long.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE; // byte, char, short and int can be converted to float if (b == float.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE; // all primitive types except bool can be converted to double ret a != bool.class ? -2 : Int.MAX_VALUE; } else { // source type is boxed - check if they're a match ret primitiveToBoxedType(b) == a ? 1 : Int.MAX_VALUE; } } else { // target type is not primitive // object type is primitive - check for exact match if (a.isPrimitive()) ret primitiveToBoxedType(a) == b ? 1 : Int.MAX_VALUE; // both types are not primitive ret b.isAssignableFrom(a) ? 1 : Int.MAX_VALUE; } }
Began life as a copy of #1034747
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035459 |
Snippet name: | typeConversionScore - backup before precise subtype dispatch |
Eternal ID of this version: | #1035459/2 |
Text MD5: | 62c12248b21ab04e6f76cb9f16b1a8b4 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-05-19 20:28:32 |
Source code size: | 1948 bytes / 53 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 112 / 122 |
Version history: | 1 change(s) |
Referenced in: | -