isComparable(Set<Class<? extends T>> set)

Guten Tag.
ich wollte eine methode schreiben, die mir für ein Set aus classen zurückgibt, ob die super classe (T) comparable ist.
Java Code:

    private static <T> boolean isComparable(Set<Class<? extends T>> set)
    {
        return !(set == null || set.isEmpty()) &&
            (set.toArray(new Object[set.size()])[0]).getClass().getSuperclass().isAssignableFrom(Comparable.class);
    }

Das ist was ich habe. nun natürlich könnte man noch zwischen variablen einführen und co kg.
Fact ist aber das der Code hässlich ist? Den kann ich doch niemanden zeigen. Gibt es da eine schönere variante?

Viele grüße.

und gerade fällt mir auf, das die Methode nicht mal funktioniert.

Der Beschreibung nach suchst du sowas wie

import java.util.HashSet;
import java.util.Set;

public class ComparableTest
{
    public static void main(String[] args)
    {
        Set<Class<?>> s0 = new HashSet<Class<?>>();
        s0.add(Number.class);

        Set<Class<?>> s1 = new HashSet<Class<?>>();
        s1.add(Integer.class);

        System.out.println(isComparable(s0));
        System.out.println(isComparable(s1));
        
    }
    private static <T> boolean isComparable(Set<Class<? extends T>> set)
    {
        if (set == null || set.isEmpty())
        {
            return false;
        }
        Class<?> element = set.iterator().next();
        return Comparable.class.isAssignableFrom(element);
    }
}

!?

EDIT: Beachte aber, dass damit in Zweifelsfall nur das ERSTE Element geprüft wird. Ein Set { Integer.class, Number.class } würde als Comparable gelten, obwohl Number nicht comparable ist. Aber natürlich kann man auch

    private static <T> boolean isComparable(Set<Class<? extends T>> set)
    {
        if (set == null || set.isEmpty())
        {
            return false;
        }
        for (Class<?> element : set)
        {
            if (!Comparable.class.isAssignableFrom(element))
            {
                return false;
            }
        }
        return true;
    }

schreiben…

Ah ich hatte das isAssignableFrom umgedreht…
Aber dabei wird doch lediglich geguckt ob jedes Element comparable ist, nicht ob T es ist oder?

mit Java Code:

     private static <T> boolean isComparable(Set<Class<? extends T>> set) { return !(set == null || set.isEmpty())
    && Comparable.class.isAssignableFrom((set.toArray(new Object[set.size()])[0]).getClass()
    .getSuperclass());
    }

geht es.

Mit

    private static <T> boolean isComparable(Set<Class<? extends T>> set)
    {
        if (set == null || set.isEmpty())
        {
            return false;
        }
        Class<?> element = set.iterator().next();
        return Comparable.class.isAssignableFrom(element);
    }

sollte es auch gehen.

Danke.

Es ist nicht nötig, die komplette Set in einen Array umzuwandeln, nur um das erste Element zu bekommen.

Das T beim Aufruf zu testen ist nicht möglich. Wenn du sowas machst wie

private static <T extends Comparable> boolean isComparable(Set<Class<? extends T>> set)

kann man es von vornherein nur mit Comparablen Elementen aufrufen, falls du das meintest

Wo ist da der Unterschied zu

private static boolean isComparable(Set<Class<? extends Comparable>> set)

?

Ich denke ja, dass sich durch eine geeignete Qualifizierung der Sets die “Komparabilität” schon zur Compilezeit sicherstellen lassen müsste -> we need more code

Tatsächlich wäre das in diesem Fall egal. Aber irgendwas will der TO wohl noch mit dem “T” machen (auch wenn sich mir noch nicht ganz erschlossen hat, was, und es (unabhängig davon ;)) schon wegen der erasure vermutlich nicht funktionieren wird…).

Ich kann mir schon Fälle vorstellen, wo man sowas brauchen könnte

Set<Set<Class<?>>> sets = getAllSets();
Set<Set<? extends Comparable>>> comparables = getAllSetsThatContainComparables(sets);

aber das ist natürlich erstmal nur akademisch-künstliche Spekulation (und Compilezeit-Sicherheit gäb’s spätestens DA ohnehin nicht…)

Guten Tag,
das ganze ist für diese Methode wichtig:
Java Code:

[ol]
[li] public static Set instance(Set<Class<? extends T>> clazzes) { Set set = isComparable(clazzes) ? new TreeSet()[/li]
[li] : new HashSet();[/li]
[li] for (Class<? extends T> clazz : clazzes) {[/li]
[li] if (Modifier.isAbstract(clazz.getModifiers()))[/li]
[li] continue;[/li]
[li] T t = instance(clazz);[/li]
[li] if (t != null)[/li]
[li] set.add(t);[/li]
[li] }[/li]
[li] return set;[/li]
[li] }[/li][/ol]

oh, ich weiß nicht warum, aber irgendwie zerhauts mir jedesmal die java tags wenn ich auf Vorschau klicke.

Ich sehe das Problem aber inzwischen als gelöst an. habe den Code nur nochmal nachgeschoben da gefragt wurde warum ich gefragt habe :smiley:

Schönen tag noch.

Ich sollte mich anmelden, dann könnte ich sowas editieren und hätte keine Doppelposts.
Aber hier ist der gesamte Code:
https://github.com/ClaasJG/shoulder/issues/2
Ich habe mal ohne Hintergedanken auf ein Problem verlinkt. :o