Wie auf ein generischer Rückgabetyp mit mehreren Begrenzungen

Ich habe vor kurzem gesehen, dass man erklären können, ein return-Typ, der ist auch begrenzt, die durch ein interface. Betrachten Sie die folgenden Klassen und Schnittstellen:

public class Foo {
    public String getFoo() { ... }
}

public interface Bar {
    public void setBar(String bar);
}

Kann ich erklären, eine Rückkehr geben wie diese:

public class FooBar {
    public static <T extends Foo & Bar> T getFooBar() {
        //some implementation that returns a Foo object,
        //which is forced to implement Bar
    }
}

Wenn ich den Anruf, dass die Methode von irgendwo, meine IDE sagt mir, dass der Rückgabetyp hat die Methode String getFoo() sowie setBar(String), aber nur, Wenn ich Punkt ein Punkt hinter der Funktion wie diese:

FooBar.getFooBar(). //here the IDE is showing the available methods.

Gibt es eine Möglichkeit, um einen Verweis auf ein solches Objekt? Ich meine, wenn ich das machen würde, so etwas wie dieses:

//bar only has the method setBar(String)
Bar bar = FooBar.getFooBar();
//foo only has the getFoo():String method
Foo foo = FooBar.getFooBar();

Ich würde gerne eine Referenz wie folgt aus (pseudo-code):

<T extents Foo & Bar> fooBar = FooBar.getFooBar();
//or maybe
$1Bar bar = FooBar.getFooBar();
//or else maybe
Foo&Bar bar = FooBar.getFooBar();

Ist dies irgendwie möglich in Java, oder bin ich nur in der Lage zu erklären, Rückgabe-Typen wie diesem? Ich glaube Java hat, geben Sie es auch, irgendwie. Ich würde es vorziehen, nicht zu greifen, um einen wrapper, wie es fühlt sich an wie Cheaten:

public class FooBarWrapper<T extends Foo&Bar> extends Foo implements Bar {
    public T foobar;

    public TestClass(T val){
        foobar = val;
    }


    @Override
    public void setBar(String bar) {
        foobar.setBar(bar);
    }

    @Override
    public String getFoo() {
        return foobar.getFoo();
    }
}

Habe Java wirklich zu erfinden, so ein nettes feature, aber vergessen, dass man gerne hätte, eine Referenz auf sich?

  • "Ich möchte einen Zeiger wie diese" - das können Sie nicht. Variablen haben einen bekannten (evtl. gelöscht) - Typ und einen Typ-Einschränkung ist nicht ein Typ
  • Außerdem, kann man eigentlich nicht alles zurückzugeben, was von getFooBar() ohne casting es um (T), das sollte einen Hinweis darauf geben, dass Sie etwas falsch machen.
  • (Seltsam genug, dieser entdeckt einen Fehler in IntelliJ code-Analyse-engine, es erkennt nur die Methoden der Foo als gültig.)
  • Könnte die downvoter bitte erklären? Dies ist eine verständliche und relativ gut geschrieben Frage.
  • Nur um zu verdeutlichen, dass die bounty Nachricht, ich bin speziell auf der Suche nach einem Anwendungsfall für eine syntax wie Foo&Bar bothFooAndBar = ... - mit Foo&Bar als Typ einer variable (wie die Frage fragt nach) oder eine Rückkehr geben.
InformationsquelleAutor Rafael T | 2013-01-22
Schreibe einen Kommentar