@NotNull
    public static Type union(@NotNull Type u, @NotNull Type v) {
        if (u.equals(v)) {
            return u;
        } else if (u == Type.UNKNOWN) {
            return v;
        } else if (v == Type.UNKNOWN) {
            return u;
        } else if (u == Type.NIL) {
            return v;
        } else if (v == Type.NIL) {
            return u;
        } else {
            return new UnionType(u, v);
        }
    }