Given two java.lang.Class objects dst and src and assuming that they represent the types Y and X respectively, I would like a function public static boolean isCastCompilable(Class dst, Class src) that returns true if and only if the statements X x; Y y = ((Y)x); would compile for those types X and Y.
Here is a first attempt at hand-coding these rules:
public class Compilable {
public boolean isCastCompilable(Class dstClass, Class srcClass) {
if (Objects.equals(srcClass, dstClass)) {
return true;
}
if (Boolean.TYPE.equals(srcClass)) {
return false; // Boolean cannot be converted explicity to any primitive type:
// https://javajee.com/casting-of-primitives-in-java
}
... more code
return false;
}
}
For instance, this function would return true for isCastCompilable(java.util.List.class, java.util.ArrayList.class) because the statements java.util.ArrayList x; java.util.List y = ((java.util.List)x); would be valid Java code that a compiler would accept.
It should return false for isCastCompilable(Boolean.TYPE, String.class) because String x; boolean y = (boolean)x; would be rejected by the compiler.
My question: Is there a straight-forward way of implementing isCastCompilable or will I have to handcode all the casting rules myself, the way I started doing in the code example above?
Context: I am making a kind of Java code generator and would like to test if the code that performs casts will compile in order not to emit invalid code.
Aucun commentaire:
Enregistrer un commentaire