@Override public Boolean visitWildcardType(WildcardType t, Type s) { if (t.isUnbound()) return false; if (!s.hasTag(WILDCARD)) { if (t.isExtendsBound()) return notSoftSubtypeRecursive(s, t.type); else return notSoftSubtypeRecursive(t.type, s); } if (s.isUnbound()) return false; if (t.isExtendsBound()) { if (s.isExtendsBound()) return !isCastableRecursive(t.type, wildUpperBound(s)); else if (s.isSuperBound()) return notSoftSubtypeRecursive(wildLowerBound(s), t.type); } else if (t.isSuperBound()) { if (s.isExtendsBound()) return notSoftSubtypeRecursive(t.type, wildUpperBound(s)); } return false; } };
@Override public Boolean visitWildcardType(WildcardType t, Type s) { if (t.isUnbound()) return false; if (s.tag != WILDCARD) { if (t.isExtendsBound()) return notSoftSubtypeRecursive(s, t.type); else // isSuperBound() return notSoftSubtypeRecursive(t.type, s); } if (s.isUnbound()) return false; if (t.isExtendsBound()) { if (s.isExtendsBound()) return !isCastableRecursive(t.type, upperBound(s)); else if (s.isSuperBound()) return notSoftSubtypeRecursive(lowerBound(s), t.type); } else if (t.isSuperBound()) { if (s.isExtendsBound()) return notSoftSubtypeRecursive(t.type, upperBound(s)); } return false; } };
@Override public Boolean visitWildcardType(WildcardType t, Type s) { if (t.isUnbound()) return false; if (!s.hasTag(WILDCARD)) { if (t.isExtendsBound()) return notSoftSubtypeRecursive(s, t.type); else return notSoftSubtypeRecursive(t.type, s); } if (s.isUnbound()) return false; if (t.isExtendsBound()) { if (s.isExtendsBound()) return !isCastableRecursive(t.type, upperBound(s)); else if (s.isSuperBound()) return notSoftSubtypeRecursive(lowerBound(s), t.type); } else if (t.isSuperBound()) { if (s.isExtendsBound()) return notSoftSubtypeRecursive(t.type, upperBound(s)); } return false; } };
@Override public Boolean visitWildcardType(WildcardType t, Type s) { if (t.isUnbound()) return false; if (s.tag != WILDCARD) { if (t.isExtendsBound()) return notSoftSubtypeRecursive(s, t.type); else // isSuperBound() return notSoftSubtypeRecursive(t.type, s); } if (s.isUnbound()) return false; if (t.isExtendsBound()) { if (s.isExtendsBound()) return !isCastableRecursive(t.type, upperBound(s)); else if (s.isSuperBound()) return notSoftSubtypeRecursive(lowerBound(s), t.type); } else if (t.isSuperBound()) { if (s.isExtendsBound()) return notSoftSubtypeRecursive(t.type, upperBound(s)); } return false; } };
public Type removeBounds() { return isUnbound() ? this : type; }
public Type removeBounds() { return isUnbound() ? this : type; }