Wie kann ich verlangen, dass ein generischer Parameter eine Aufzählung ist, die eine Schnittstelle implementiert?

Lesezeit: 3 Minuten

Benutzeravatar von Sbodd
Sbodd

Ich bin nicht zu 100 % davon überzeugt, dass dies eine gute Idee ist, aber ich bin heute auf Code gestoßen, der derzeit wie folgt implementiert ist:

class MyWidget <T extends Enum<T> > {
  MyWidget(Map<T, Integer> valueMap) {
    mValueMap = valueMap;
  }

  Map<T, Integer> mValueMap;
}

wo MyWidget bietet dann Methoden an, die verwenden mValueMap das Eingereichte umzuwandeln Enum nach/von einem Integer.

Was ich überlegte, war der Versuch, dies umzugestalten, damit ich meine Aufzählung deklarieren würde:

interface MyInterface {
  public Integer getValue();
}

enum MyEnum implements MyInterface {
  foo, bar;
  public Integer getValue() {
    return ordinal();
  }
}

Und dann könnte ich umschreiben MyWidget in etwas, das vage so aussah:

public class MyWidget<T extends Enum<T> extends MyInterface> {
  ...
}

und würde dann die anrufen können getValue() Methode aus MyInterface an T-Typ-Objekte innerhalb MyWidget. Das Problem ist natürlich, dass “<T extends Enum<T> extends MyInterface>” ist keine gültige Syntax. Gibt es eine Möglichkeit, dies zu umgehen?

Ich will nicht nur haben MyWidget<T extends MyInterface>weil es auch wichtig ist, dass T eine Aufzählung ist.

Danke im Voraus!

Benutzeravatar von Michael Myers
Michael myers

Benutze ein ‘&‘ stattdessen:

public class MyWidget<T extends Enum<T> & MyInterface> {
    ...
}

Das JLS nennt dies einen “Schnittpunkttyp”, aber ich kann ihn in den Java-Tutorials nicht erwähnen. Ich sage nur, dass es genau das tut, was Sie sich gewünscht haben.extends” würdest du.

Außerdem sollte ich erwähnen, dass Sie im Schnittpunkttyp so viele Typen haben können, wie Sie möchten. Wenn Sie also wollten, könnten Sie Folgendes tun:

public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> {
    ...
}

[Note: this code sample should not be construed as an endorsement of the Cloneable interface; it was merely handy at the time.]

  • Die &-Syntax ist ordentlich, aber ich finde, dass die Verwendung normalerweise zu einem Code-Geruch wird und ein Hinweis darauf ist, dass etwas mit Ihrem Modell nicht ganz stimmt.

    – Skaffmann

    1. Juli 2009 um 19:33 Uhr

  • Ich neige dazu, zuzustimmen (ich glaube, ich habe es vielleicht ein- oder zweimal benutzt, wenn das so ist). Aber im Fall von Enums, die eine Schnittstelle implementieren, halte ich es für angemessen.

    – Michael myers

    1. Juli 2009 um 19:41 Uhr

  • Vielen Dank. Ihr Beitrag hat mir irgendwie klar gemacht, dass das, was ich wirklich brauchte, in die Richtung von … doSomething(Enum<? extends SomeInterface>)

    – Jörg

    8. Juni 2011 um 8:17 Uhr


  • @skaffmann, wenn Sie Zeit finden würden, Ihre Erfahrungen mit WRT zu teilen Code riechtwürde ich wirklich schätzen

    – Jörg

    8. Juni 2011 um 8:17 Uhr


  • +10 Ich hätte das nie alleine herausgefunden. Die einzige Möglichkeit, Aufzählungen mit Schnittstellen zu behandeln.

    – David Lynch

    11. September 2012 um 21:57 Uhr

Das JSR 203-Zeug (new new IO) für JDK 7 macht viel Gebrauch von Aufzählungen, die Schnittstellen implementieren (zum Beispiel: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption.html), um ihnen in Zukunft etwas Spielraum für zukünftige zusätzliche Sätze von Enum-Optionen zu geben. Das ist also ein praktikabler Ansatz und offensichtlich einer, der nach langem Nachdenken in einem großen Sun-Projekt gewählt wurde.

  • Sauber. Hoffentlich erscheint Java 7, bevor mein Bart grau wird.

    – Skaffmann

    1. Juli 2009 um 20:16 Uhr

  • Nachdem ich eine kleine Menge Code geschrieben habe, der dieses Zeug verwendet, ist mein Eindruck, dass es ein bisschen seltsam ist. Ich kann nicht sagen, dass ich es woanders gesehen habe. Etwas mit einer 7 im Namen wird 2010 erscheinen, da bin ich mir ziemlich sicher. Ob es “Java 7” sein wird, wie es von der JCP gebilligt wird, weiß ich nicht. Das kann jetzt nur Oracle beantworten…

    – Alex Müller

    1. Juli 2009 um 20:51 Uhr

  • docs.oracle.com/javase/8/docs/api/java/nio/file/…

    – nessa.gp

    15. April 2020 um 8:02 Uhr

1431040cookie-checkWie kann ich verlangen, dass ein generischer Parameter eine Aufzählung ist, die eine Schnittstelle implementiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy