Java 1.6 Generics Problem

Moderator: Aktive Fachschaft

SmilingJ
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 292
Registriert: 5. Okt 2004 21:37
Kontaktdaten:

Java 1.6 Generics Problem

Beitrag von SmilingJ » 30. Sep 2008 20:58

Moin, ich habe ein kleines Problem mit den Java Generics. Folgenden Code habe ich:

Code: Alles auswählen

	private Set<Integer>[][] candidates = new Set[9][9];
	
	public Board(int[][] board) {
		this.board = board;
		for(int row=0; row<9; row++)
			for(int col=0; col<9; col++)
				this.candidates[row][col] = new LinkedHashSet<Integer>();
	}
Bei der Deklaration von candidates gibt mir Eclipse eine Warnung "Type Savety: ..." (funktioniert trotzdem wenn ich jetzt aber folgendes schreibe:

Code: Alles auswählen

	private Set<Integer>[][] candidates = new Set<Integer>[9][9];
Will eclipse gar nicht mehr.. hat jemand ne Idee, wie ich das Typesafe deklarieren kann?
Drei Menschen können ein Geheimnis bewahren, wenn zwei von ihnen tot sind. - Benjamin Franklin

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Java 1.6 Generics Problem

Beitrag von Krümelmonster » 30. Sep 2008 21:29

Evtl, weil Set ein Interface ist?

//edit
Da die Größe des Arrays erst zur Laufzeit feststeht, sind generische Arrays nicht "möglich" (nicht auf diese einfache Weise).
Siehe dazu diesen Thread.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

SmilingJ
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 292
Registriert: 5. Okt 2004 21:37
Kontaktdaten:

Re: Java 1.6 Generics Problem

Beitrag von SmilingJ » 30. Sep 2008 22:35

danke für die info..
Drei Menschen können ein Geheimnis bewahren, wenn zwei von ihnen tot sind. - Benjamin Franklin

fl4$h g0rd0n
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 115
Registriert: 1. Okt 2007 22:20

Re: Java 1.6 Generics Problem

Beitrag von fl4$h g0rd0n » 30. Sep 2008 23:37

Krümelmonster hat geschrieben://edit
Da die Größe des Arrays erst zur Laufzeit feststeht, sind generische Arrays nicht "möglich" (nicht auf diese einfache Weise).
Siehe dazu diesen Thread.
Hmm, das kann eigentlich nicht der Grund sein.
Java Arrays "kennen" den Typ, den sie speichern. Dementsprechend gibt es auch Runtime-Checks bei Zuweisungen. Andernfalls kann man sich durch Casts am Typsystem vorbeimogeln und ungültige Werte in ein Array reinkriegen.
Bei Generics fehlen die Typinformationen zur Laufzeit. Daher ist es sinnfrei, bspw. ein List<Integer>[] direkt zu instanziieren. Das Array "weiß" nicht, dass es List<Integer> Einträge speichert.

100% sicher bin ich aber auch nicht. Ich lasse mich gerne eines Besseren belehren.
"Education is the path from cocky ignorance to miserable uncertainty" -- Mark Twain

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Java 1.6 Generics Problem

Beitrag von Krümelmonster » 1. Okt 2008 00:09

Ich habe nur diesen Post zitiert.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

fl4$h g0rd0n
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 115
Registriert: 1. Okt 2007 22:20

Re: Java 1.6 Generics Problem

Beitrag von fl4$h g0rd0n » 1. Okt 2008 01:51

Und was genau willst du damit sagen? Das "Zitat" erweckt den Eindruck, als sei dies die Kernaussage des verlinkten Threads und dass du davon überzeugt bist.
Das ist aber nicht der Grund, warum solche Array Instanziierungen nicht gehen. Im gleichen Thread wird sogar ein Gegenargument geliefert:
http://forums.sun.com/thread.jspa?messa ... 38#3022938
"Education is the path from cocky ignorance to miserable uncertainty" -- Mark Twain

Yen
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 184
Registriert: 2. Sep 2004 16:54
Wohnort: Langen

Re: Java 1.6 Generics Problem

Beitrag von Yen » 1. Okt 2008 10:16

Versuch es doch mal mit

Code: Alles auswählen

	private Set<Integer>[][] candidates = new HashSet<Integer>[9][9];
habs nicht getestet, löst aber hoffentlich das Problem mit dem Interface

SmilingJ
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 292
Registriert: 5. Okt 2004 21:37
Kontaktdaten:

Re: Java 1.6 Generics Problem

Beitrag von SmilingJ » 1. Okt 2008 10:37

Yen hat geschrieben:Versuch es doch mal mit

Code: Alles auswählen

	private Set<Integer>[][] candidates = new HashSet<Integer>[9][9];
habs nicht getestet, löst aber hoffentlich das Problem mit dem Interface
nö, das HashSet will er genausowenig ...
Drei Menschen können ein Geheimnis bewahren, wenn zwei von ihnen tot sind. - Benjamin Franklin

Steven
Kernelcompilierer
Kernelcompilierer
Beiträge: 425
Registriert: 2. Sep 2008 10:00
Wohnort: Frankfurt am Main

Re: Java 1.6 Generics Problem

Beitrag von Steven » 1. Okt 2008 12:57

Im Sun-Thread findet sich mit dem Hinweis auf die Kovarianz von Arrays aber auch die korrekte Antwort, warum so etwas nicht geht. Zur Laufzeit ist das nur noch ein Set [][] a = new Set [9] [9], theoretisch könntest du also folgendes machen: a [0] = new Set <String> [9]; Das würde jedoch deiner Definition von Set<Integer> widersprechen - die Typsicherheit ist nicht mehr gewährleistet, wie es der Compiler in der Warning auch sagt.

// Edit: Das ist Java-spezifisch und keine allgemeine Einschränkung der Theorie von Generics. Es gibt Laufzeitumgebungen, die den generischen Typ "mitnehmen" und damit solche Konstrukte unterstützen (.net zum Beispiel).

Antworten

Zurück zu „Offtopic“