|
|
@@ -51,89 +51,66 @@ public final class RCompareUtils {
|
|
|
return isSuper(true, type, IClass.typefor(object));
|
|
|
}
|
|
|
|
|
|
+ // isuper.params().equals(iclass.params())
|
|
|
+ //
|
|
|
+ // to nam załatwia "wildcards:inside" bo tak naprawdę "inside" dla wildcardów to
|
|
|
+ // jednoczesne super & subclass. O ile tylko dobrze je zaimplementujemy to MUSI
|
|
|
+ // działać prawidłowo. Jeśli nie działa, to znaczy, że mamy zaimplementowane źle.
|
|
|
+ //
|
|
|
+ // a to oznacza też, że subclass mamy z głowy, bo dobrze zrobione "super" MUSI
|
|
|
+ // działać prawidłowo: anty-symetrycznie.
|
|
|
+ //
|
|
|
+ // pamiętać: RClass zachowouje się jak RWClass z upper-boundem
|
|
|
+ // to nam da gratis dwie metody: rw-ac oraz ac-rw
|
|
|
+ // wystarczy, że rw-rw prawidłowo zaimplementujemy.
|
|
|
+
|
|
|
private static boolean isSuper(boolean box, IClass isuper, IClass iclass) {
|
|
|
if(isuper == AClass.NULL) {
|
|
|
return !iclass.isPrimitive();
|
|
|
}
|
|
|
- boolean sw = (isuper instanceof RWClass);
|
|
|
- boolean cw = (iclass instanceof RWClass);
|
|
|
- if(sw && cw) {
|
|
|
- return isSuper(box, (RWClass)isuper, (RWClass)iclass);
|
|
|
- }
|
|
|
- else if(sw && !cw) {
|
|
|
- return isSuper(box, (RWClass)isuper, (AClass)iclass);
|
|
|
- }
|
|
|
- else if(!sw && cw) {
|
|
|
- return isSuper(box, (AClass)isuper, (RWClass)iclass);
|
|
|
- }
|
|
|
- else {
|
|
|
- return isSuper(box, (AClass)isuper, (AClass)iclass);
|
|
|
+ Bound sw = new Bound(isuper);
|
|
|
+ Bound cw = new Bound(iclass);
|
|
|
+ if(sw.wildcard || cw.wildcard) {
|
|
|
+ return isSuperBound(sw, cw);
|
|
|
}
|
|
|
+ Class<?> sr = isuper.reflective();
|
|
|
+ Class<?> cr = iclass.reflective();
|
|
|
+ List<IClass> sp = isuper.params();
|
|
|
+ List<IClass> cp = iclass.params();
|
|
|
+ return isSuperRaw(box, sr, cr) && sp.equals(cp);
|
|
|
}
|
|
|
|
|
|
- private static <T extends String & CharSequence> boolean isSuper(boolean box, RWClass isuper, RWClass iclass) {
|
|
|
- // czy isuper.lower isSuper iclass.upper ?
|
|
|
- // czy iclass.lower isSuper isuper.upper ?
|
|
|
-
|
|
|
- for(IClass c : isuper.lower()) {
|
|
|
- for(IClass p : iclass.upper()) {
|
|
|
- if( !isSuper(c, p) ) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for(IClass c : iclass.lower()) {
|
|
|
- for(IClass p : isuper.upper()) {
|
|
|
- if( !isSuper(c, p) ) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return isSuperList(false, isuper.params(), iclass.params());
|
|
|
+ private static boolean isSuperRaw(boolean box, Class<?> isuper, Class<?> iclass) {
|
|
|
+ return box ? ClassTraits.isSuper(isuper, iclass) : isuper.isAssignableFrom(iclass);
|
|
|
}
|
|
|
+
|
|
|
|
|
|
- private static boolean isSuper(boolean box, RWClass isuper, AClass iclass) {
|
|
|
- for(IClass c : isuper.lower()) {
|
|
|
- if(!isSubclass(iclass,c)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- for(IClass c : isuper.upper()) {
|
|
|
- if(!isSuper(iclass, c)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- return isSuperList(false, isuper.params(), iclass.params());
|
|
|
+ private static boolean isSuperBound(Bound isuper, Bound iclass) {
|
|
|
+ // @todo (assira #0) reflective wildcards issuper
|
|
|
+ throw new UnsupportedOperationException("Not supported yet.");
|
|
|
+// return isuper.params().equals(iclass.params());
|
|
|
}
|
|
|
|
|
|
- private static boolean isSuper(boolean box, AClass isuper, RWClass iclass) {
|
|
|
- for(IClass c : iclass.lower()) {
|
|
|
- if(!isSubclass(isuper,c)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- for(IClass c : iclass.upper()) {
|
|
|
- if(!isSuper(isuper, c)) {
|
|
|
- return false;
|
|
|
+ private static class Bound {
|
|
|
+
|
|
|
+ private static final IClass[] EMPTY = new IClass[0];
|
|
|
+
|
|
|
+ final IClass[] lower;
|
|
|
+ final IClass[] upper;
|
|
|
+ final boolean wildcard;
|
|
|
+
|
|
|
+ public Bound(IClass type) {
|
|
|
+ if(type instanceof RWClass) {
|
|
|
+ this.wildcard = true;
|
|
|
+ this.lower = ((RWClass)type).lower();
|
|
|
+ this.upper = ((RWClass)type).upper();
|
|
|
+ } else {
|
|
|
+ this.wildcard = false;
|
|
|
+ this.lower = EMPTY;
|
|
|
+ this.upper = new IClass[]{type};
|
|
|
}
|
|
|
}
|
|
|
- return isSuperList(false, isuper.params(), iclass.params());
|
|
|
- }
|
|
|
-
|
|
|
- private static boolean isSuper(boolean box, AClass isuper, AClass iclass) {
|
|
|
- if(!isSuperRaw(box, isuper.reflective(), iclass.reflective())) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- return isSuperList(box, isuper.params(), iclass.params());
|
|
|
- }
|
|
|
-
|
|
|
- private static boolean isSuperRaw(boolean box, Class<?> isuper, Class<?> iclass) {
|
|
|
- return box ? ClassTraits.isSuper(isuper, iclass) : isuper.isAssignableFrom(iclass);
|
|
|
- }
|
|
|
-
|
|
|
- private static boolean isSuperList(boolean box, List<IClass> list1, List<IClass> list2) {
|
|
|
- return ListUtils.equals(list1, list2, (a,b) -> RCompareUtils.isSuper(box,a,b));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|