Type-Parameterverwirrung

BinFox

Neues Mitglied
Hallo,
untersuche gerade etwas in Java und mich verwirrt ein untypisierter Typeparameter:

Java:
@SuppressWarnings({"rawtypes", "unchecked"})
class MapBuilder0Impl implements intermediates.MapBuilder0 {

  MapBuilderAction action;

  MapBuilder0Impl(MapBuilderAction action) {
    this.action = action;
  }

  @Override
  public Integer build() {
    return this.action.state0$build();
  }

  @Override
  public void print() {
    this.action.state0$print();
  }

  @Override
  public <K, V> intermediates.MapBuilder1<K, V> put(K key, V value) {
    this.action.state0$put(key, value);
    return new MapBuilder1Impl(this.action);
  }
}

Er kommt aus einem Interface:

Java:
interface MapBuilderAction<K, V> {

  default Integer state0$build() {
    return build();
  }

  default void state0$print() {
    print();
  }

  default void state0$put(K key, V value) {
    put(key, value);
  }

  default Integer state1$build() {
    return build();
  }

  default void state1$print() {
    print();
  }

  default void state1$put(K key, V value) {
    put(key, value);
  }

  Integer build();

  void print();

  void put(K key, V value);
}

Warum kann er unparametrisiert sein?

Vielen Dank
Jan
 

httpdigest

Top Contributor
Du zeigst hier Code einer Klasse und eines Interfaces.
Was genau meinst du mit "untypisierter Typeparameter"?
Ein Typparameter kann nicht typisiert sein. Er kann nur "bounded" bzw. begrenzt sein (durch "extends X" oder "super X").
Oder meinst du die Deklaration der Instanzvariable `MapBuilderAction action;` der Klasse `MapBuilder0Impl` und warum diese Deklaration keine Typargumente verwendet?
In diesem Fall ist der Typ der Instanzvariable `action` ein "raw type". Raw Types wurden der Abwärtskompatibilität wegen eingeführt, damit früherer pre-Java1.5 Code immer noch mit bereits generifizierten Klassen/Interfaces (z.B. in einem Java 1.5 JDK) compiliert/funktioniert.
Warum dieser spezielle Code allerdings hier raw types verwendet, weiß wohl nur der Implementierer.
 

ing0-bing0

Aktives Mitglied
In diesem Fall ist der Typ der Instanzvariable `action` ein "raw type". Raw Types wurden der Abwärtskompatibilität wegen eingeführt, damit früherer pre-Java1.5 Code immer noch mit bereits generifizierten Klassen/Interfaces (z.B. in einem Java 1.5 JDK) compiliert/funktioniert.
Das ist falsch, raw types gab es schon immer, und sie wurden GSD auch nicht abgeschafft. ;)

Andere Sprachen halten sich nicht so strikt an die Abwärtskompatibilität...

Die eigentliche Frage wurde ja schon geklärt, sieht übrigens aus wie ein Dekompilat...
 

KonradN

Super-Moderator
Mitarbeiter
Das ist falsch, raw types gab es schon immer, und sie wurden GSD auch nicht abgeschafft. ;)
Nein, raw types kann es nur mit Generics geben, denn diese sind ja in der JLS (Links habe ich ja bereits gebracht) als
A raw type is the name of a generic class or interface without any type arguments
definiert.

Was Du vermutlich meinst ist einfach genau das, was doch httpdigest schon geschrieben hat: Viele Generische Klassen gab es vor Einführung bereits als normale Klasse. Ohne raw types würde Code von Java < 1.5 nicht mehr mit Java 1.5+ laufen. Daher wurde in der JLS 1.5 eben auch raw types eingeführt.

Dies wird übrigens auch in der Java Dokumentation selbst so beschrieben (anderer Link):
Raw types show up in legacy code because lots of API classes (such as the Collections classes) were not generic prior to JDK 5.0. When using raw types, you essentially get pre-generics behavior — a Box gives you Objects. For backward compatibility, assigning a parameterized type to its raw type is allowed:

Daher ist das, was httpdigest geschrieben hat wohl doch richtig :)
 

ing0-bing0

Aktives Mitglied
Ja es kommt darauf an, was man unter raw types versteht. Für mich gehören raw types nicht zu Generics. Die jungen Burschen mögen das anders sehen. ;)
 

KonradN

Super-Moderator
Mitarbeiter
Ja es kommt darauf an, was man unter raw types versteht.
Im Java Umfeld würde ich da auf die Definition in der JLS zurück greifen. Das wäre eine Basis, die ich hier als üblich ansehen würde.

Du kannst gerne andere Definitionen verwenden, aber dann wäre es wünschenswert, wenn Du die Definition mit nennen würdest, damit man nicht aneinander vorbei redet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M java: unexpected type Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
K Wildcard und class type Allgemeine Java-Themen 9
bueseb84 required a bean of type that could not be found. Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
E javax.mail sene Type ändern Allgemeine Java-Themen 2
T JNA: Invalid sizeof type 4 Allgemeine Java-Themen 0
P List<Type> Konvertieren in List<List<Type>> Allgemeine Java-Themen 3
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
D Type herausfinden Allgemeine Java-Themen 15
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
V Wildcard aus Parameter in return type Allgemeine Java-Themen 2
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
C Kompletter Pfad aus "input type=file" auslesen Allgemeine Java-Themen 3
I Library für High Performance Mime Type Erkennung Allgemeine Java-Themen 8
P Mime Type aus Stream lesen Allgemeine Java-Themen 5
J BufferedImage aus PNG Files haben keinen Type Allgemeine Java-Themen 4
G POI: Leere Zelle nimmt keinen Type an Allgemeine Java-Themen 8
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
M Type-Cast Allgemeine Java-Themen 3
B Warum return type Object ? Allgemeine Java-Themen 4
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
S Innerer Type einer generischen Collection herausfinden? Allgemeine Java-Themen 13
S Collection Type Allgemeine Java-Themen 8
zilti NetBeans 6.0: neuen File Type definieren Allgemeine Java-Themen 2
S anderer Mime Type bei xml-Datei Allgemeine Java-Themen 2
G Error: Hashtable Type safety: The method put(Object, Object) Allgemeine Java-Themen 6
A serial Version UID field of type long Allgemeine Java-Themen 5
G Enclosing Type Allgemeine Java-Themen 3
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
T Generics, Enumerations und Type-Casts Allgemeine Java-Themen 13
K The method clone() from the type Object is not visible. Allgemeine Java-Themen 9
C REG_BINARY Type in Windows Registry ausgeben ? Allgemeine Java-Themen 4
M Content-Type setzen und auslesen? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben