Generic - Autoboxing

Javt

Aktives Mitglied
Hi,

Normalerweise sind doch bei Generics als Parameter nur Klassen und keine primitiven Datentypen zugelassen. Wieso ist dann folgendes möglich?:
Java:
    public static <V> V first(V wert1, V wert2) {
		return wert1;
	}
	
	public static void main(String[] args) {
		first(1, 2);
	}

Macht der Compiler hier ein Autoboxing nach Integer oder wie ist das zu verstehen?
 

njans

Top Contributor
Passiert doch genauso, wenn du eine ArrayList<Integer> befüllst: add(5);
Da wird auch nur Autoboxing betrieben ^^
 

Javt

Aktives Mitglied
Also legt der Compiler automatisch den Typ von "V" als "Integer" fest und macht dann für die zwei primitiven Datentypen ein Autoboxing oder?
 

Javt

Aktives Mitglied
"Comparable" ist doch normalerweise ein "Interface". Wieso kann man es bei Generics einfach erweitern "extend"? (es heißt normalerweise "implements"):
Java:
public static <T extends Comparable<T>> T max( T m, T n )
{
  return m.compareTo( n ) > 0 ? m : n;
}

lg
 
G

Gast2

Gast
Das
Code:
extends
bei den Generics hat gar nichts mit erweitern oder implementieren zutun. Das nennt sich bounded wildcards, bzw. bounded type parameters.
 

Landei

Top Contributor
Das ist in der Tat inkonsequent. Allerdings kannst du mehrere Bounds für eine Typvariable haben, und [c]<T extends Number implements Serializable>[/c] fanden dann wahrscheinlich selbst die Java-Gurus zu heavy, und haben es bei [c]<T extends Number & Serializable>[/c] belassen.

Ich persönlich wäre sehr dafür, sich generell auf ein einziges Schlüsselwort bei der Vererbung zu einigen. Es passiert eben doch hin und wider, dass man aus einem Interface eine abstrakte Klasse macht (oder umgekehrt) und dann überall das [c]implements[/c] durch [c]extends[/c] ersetzen muss.
 
Zuletzt bearbeitet:
G

gst

Gast
Das ist in der Tat inkonsequent. Allerdings kannst du mehrere Bounds für eine Typvariable haben, und [c]<T extends Number implements Serializable>[/c] fanden dann wahrscheinlich selbst die Java-Gurus zu heavy, und haben es bei [c]<T extends Number & Serializable>[/c] belassen.
Wieso ist das inkonsequent? Dass bei Generics die Unterscheidung zwischen Klassen und Interfaces irrelevant ist ist doch eine IMHO gute Entscheidung gewesen. Oder willst du in der Praxis T auf Klassen oder Interfaces einschränken, und die Generics-Geschichte noch weiter aufblähen?
 

Landei

Top Contributor
Hast du meinen Post überhaupt gelesen? Ich habe ein Beispiel gebracht, wo eine Unterscheidung zwischen [c]extends[/c] und [c]implements[/c] bei Generics genau zu dieser Aufblähung geführt hätte.

Trotzdem ist es inkonsistent hinsichtlich der "normalen" Verwendung, wobei ich dafür plädieren würde, auch dort nur ein Schlüsselwort (etwa [c]extends[/c]) für alles zu verwenden - bei genauerem Hinsehen ist der Unterschied dort auch ziemlich irrelevant.
 

Clayn

Aktives Mitglied
Naja ich würd das dahingehend sehen das der generische Typ ja erstmal unbekannt ist also Klasse oder Interface sein kann. Und ein Interface erbt ja auch über extends. Deswegen find ich macht das schon sind bei generics.

Allerdings bei implementierungen find ichs eigentlich besser so, weil dadurch auch nochmal besser rüberkommt, dass man nur von einer Klasse direkt Vererben kann aber mehrere implementieren.
 
H

hüteüberhüte

Gast
@Clayn: Ein Interface wird nicht erweitert ("extends"), es wird implementiert ("implements")

Finde es gut, dass bei Generics nicht unterschieden wird. Dann muss man sich allerdings zwangsläufig auf einen Begriff einigen oder man führt ein ganz neues Schlüsselwort ein, was auch wieder aufgebläht wirken würde
 
Zuletzt bearbeitet von einem Moderator:

Clayn

Aktives Mitglied
Das ein Interface implementiert ist mir klar. Aber ich meine ein Interface was von einem Interface erbt. Das wird wiederum mit extends gemacht. Z.B.:
Java:
public interface SomeInterfaceA {
}

public interface SomeInterfaceB extends SomeInterfaceA{
}

jetzt klarer geworden was ich meine?
 
H

hüteüberhüte

Gast
Jep, das ist auch schon wieder so ein spezieller Fall, der zu Missverständnissen führen könnte...
 
G

gst

Gast
Man muss den C#-Jungs neidlos zugestehen, dass das dortige ":" um einiges besser als das aufgeblähte extends/implements-Geraffel von Java ist. Wer weiß, welcher Overengineering-Teufel Sun damals geritten hatte.
 

Clayn

Aktives Mitglied
Naja was heißt spezieller Fall. Das Interface erweitert ja das bestehende also finde ich die Namensgebung schon passend.

Und von wegen für alles extends was ist wenn man sowas hat?

Java:
public class Foo extends A,B,C,D 
{

}

Wenn das jemand sieht weißt man gar nicht was da nun ne klasse ist oder ein Interface oder sonstwas.
 
G

gst

Gast
Und von wegen für alles extends was ist wenn man sowas hat?

Java:
public class Foo extends A,B,C,D 
{

}

Wenn das jemand sieht weißt man gar nicht was da nun ne klasse ist oder ein Interface oder sonstwas.
Klar, wenn man derart unsinnige Klassennamen nimmt kann man da natürlich wunderbar ein Problem hinkonstruieren, wo gar keins ist. Bei sprechenden Namen hingegen ist sehr wohl klar, was Basisklasse und was zusätzliche Fähigkeiten sind. Außerdem halte ich das ewige Interface vs. Klasse eh für Käse. Man sollte gegen Interfaces programmieren und es sollte so einfach wie möglich sein Interfaces gegen Klassen gegen Traits / Mixins oder was weiß ich noch zu tauschen OHNE dafür jedesmal implements gegen extends zu tauschen, und ähnliche Späßchen zu veranstalten.

Wenn ich sowas hier habe:
Java:
class Person : Creature, HasName, CanSpeak {
    ....
}
dann kommuniziert das klar und deutlich was eine Person für mich ist. HasName und CanSpeak können interfaces sein. Es könnten aber auch Mixins sein. Was es genau ist wird durch die einheitliche Notation schön entkoppelt.
 

Noctarius

Top Contributor
Ich finde es immer lustig wie Ihr Euch über so kleine Syntaxdinge streiten könnt :) Wer erst einmal eine Sprache unter den Fingern hat die einen zum Einrücken zwingt (Codeblockdefinition) der weint bei sowas nicht mehr *g* *duck*
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
O Comparable Generic Java Basics - Anfänger-Themen 24
F Type safety: A generic array of.. Fehler Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
O Generic - Verstädnisproblem Java Basics - Anfänger-Themen 5
G instanceof in Generic Java Basics - Anfänger-Themen 7
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
P Variablen generic type variablen in object array Java Basics - Anfänger-Themen 1
M Generic Prüfungsvorbereitung Java Basics - Anfänger-Themen 4
G Generic und Listen Java Basics - Anfänger-Themen 8
N Generic clonen => eclipse empfiehlt @SuppressWarnings("unchecked") Java Basics - Anfänger-Themen 2
S Generic Java Basics - Anfänger-Themen 9
P Java Generic Wildcard Java Basics - Anfänger-Themen 2
G Namen der Generic Klasse Java Basics - Anfänger-Themen 3
D generic extendet class Java Basics - Anfänger-Themen 10
M Generic's und Vererbung Java Basics - Anfänger-Themen 6
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
C Generic Tutorial Java Basics - Anfänger-Themen 12
T Generic vom Generic: Zu sehr verschachtelt? Java Basics - Anfänger-Themen 6
V libssrckdtree-j Generic k-d tree Java library - weiss nicht wo des hin soll Java Basics - Anfänger-Themen 2
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
0 Was bedeutet dieser Generic-code? Java Basics - Anfänger-Themen 3
A Generic Problem Java Basics - Anfänger-Themen 16
S Generic Methode: syntax klemmt Java Basics - Anfänger-Themen 10
S Generic: Verständnisfrage Java Basics - Anfänger-Themen 2
S generic programmierung "ne:w T[X]" Java Basics - Anfänger-Themen 2
G generic interface problem Java Basics - Anfänger-Themen 12
Safado generic array creation Java Basics - Anfänger-Themen 2
G Frage zur Generic java ? Java Basics - Anfänger-Themen 9
G eine Frage zur Generic Java ? Java Basics - Anfänger-Themen 8
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
G Eigener Autoboxing Datentyp Java Basics - Anfänger-Themen 3
Guybrush Threepwood Autoboxing ArrayList Java Basics - Anfänger-Themen 11
F Autoboxing/Unboxing unter Eclipse Java Basics - Anfänger-Themen 7

Ähnliche Java Themen


Oben