public WildcardType getWildcardType(Collection<ReferenceType> upperBounds,
                                        Collection<ReferenceType> lowerBounds) {
        BoundKind kind;
        Type bound;
        int uppers  = upperBounds.size();
        int downers = lowerBounds.size();

        if (uppers + downers > 1) {
            throw new IllegalArgumentException("Multiple bounds not allowed");

        } else if (uppers + downers == 0) {
            kind = BoundKind.UNBOUND;
            bound = env.symtab.objectType;

        } else if (uppers == 1) {
            assert downers == 0;
            kind = BoundKind.EXTENDS;
            bound = ((TypeMirrorImpl) upperBounds.iterator().next()).type;

        } else {
            assert uppers == 0 && downers == 1;
            kind = BoundKind.SUPER;
            bound = ((TypeMirrorImpl) lowerBounds.iterator().next()).type;
        }

        if (bound instanceof Type.WildcardType)
            throw new IllegalArgumentException(bound.toString());

        return (WildcardType) env.typeMaker.getType(
                new Type.WildcardType(bound, kind, env.symtab.boundClass));
    }