Transpiled version (123L) is out of date.
1 | // Can a be converted to b? |
2 | |
3 | // score 0 = exact match |
4 | // score Int.MAX_VALUE = no match |
5 | // score 1 = conversion needed (boxing/unboxing or non-primitve widening) |
6 | // score -2 = primitive widening needed |
7 | |
8 | static int typeConversionScore(Class a, Class b) { |
9 | if (a == b) ret 0; |
10 | |
11 | if (b.isPrimitive()) { |
12 | // target type is primitive |
13 | |
14 | if (a.isPrimitive()) { |
15 | // both types are primitive |
16 | |
17 | // No widenings to bool |
18 | if (b == bool.class) ret Int.MAX_VALUE; |
19 | |
20 | // No widenings to byte |
21 | if (b == byte.class) ret Int.MAX_VALUE; |
22 | |
23 | // byte can be converted to char |
24 | if (b == char.class) ret a == byte.class ? -2 : Int.MAX_VALUE; |
25 | |
26 | // byte can be converted to short |
27 | if (b == short.class) ret a == byte.class ? -2 : Int.MAX_VALUE; |
28 | |
29 | // byte, char and short can be converted to int |
30 | if (b == int.class) ret a == byte.class || a == char.class || a == short.class ? -2 : Int.MAX_VALUE; |
31 | |
32 | // byte, char, short and int can be converted to long |
33 | if (b == long.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE; |
34 | |
35 | // byte, char, short and int can be converted to float |
36 | if (b == float.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE; |
37 | |
38 | // all primitive types except bool can be converted to double |
39 | ret a != bool.class ? -2 : Int.MAX_VALUE; |
40 | } else { |
41 | // source type is boxed - check if they're a match |
42 | ret primitiveToBoxedType(b) == a ? 1 : Int.MAX_VALUE; |
43 | } |
44 | } else { |
45 | // Target type b is not primitive. |
46 | |
47 | // Object type a is primitive - check for exact match |
48 | if (a.isPrimitive()) |
49 | ret primitiveToBoxedType(a) == b ? 1 : Int.MAX_VALUE; |
50 | |
51 | // BOTH TYPES ARE NOT PRIMITIVE. |
52 | |
53 | // if not assignable, no match |
54 | if (!b.isAssignableFrom(a)) ret Int.MAX_VALUE; |
55 | |
56 | // if assignable, get precise score |
57 | |
58 | // if any is an interface, just get score 1 |
59 | if (a.isInterface() || b.isInterface()) ret 1; |
60 | |
61 | if (a.isArray() && b.isArray()) |
62 | ret typeConversionScore(a.getComponentType(), b.getComponentType())/2; |
63 | |
64 | // for classes, count subclass distance |
65 | ret subclassDistance(a, b)*2; |
66 | } |
67 | } |
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, ekrmjmnbrukm, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1034747 |
Snippet name: | typeConversionScore |
Eternal ID of this version: | #1034747/12 |
Text MD5: | 7d1970f2d3ababee65e6c8e935afd6df |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-12-11 23:16:31 |
Source code size: | 2364 bytes / 67 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 171 / 270 |
Version history: | 11 change(s) |
Referenced in: | [show references] |