Untrivialer Typencast-Ergebniss:

O

o4kareg2

Gast
Wenn ich folgender Typ-Casting mache:

[JAVA=42]
public class PagedArrayList<T> {...
...
private T[][] pages;
... pagesSize = 16;
...

pages = (T[][]) new Object[pagesSize];

[/code]
Dann ist jetz Array Pages von: T[][pagesSize] oder T[pagesSize][] - ?
 
T

Tomate_Salat

Gast
Ich bezweifle auch, dass das funktionieren wird. Mal abgesehen davon das du versuchst ein 1D-Array in ein 2D-Array zu casten, hast du noch ein Typenproblem. T dürfte niemals etwas anderes sein als vom Typ java.lang.Object. Da du wohl zu 99,99% Daten hinterlegen willst, die von Object erben, wird das nicht funktionieren.

Du bekommst mal minimum eine ClassCastException.

Ach ja und btw: Das sind Dinge, für die man keinen Thread eröffnen sollte. Wenn du das einfach mal ausführst, wirst du schon sehen, ob es kracht oder nicht.
 
S

SlaterB

Gast
> T dürfte niemals etwas anderes sein als vom Typ java.lang.Object.
wieso? wird doch nur intern verwendet, da klappt schon alles,

damit es kompiliert muss es nur auf
> (T[][]) new Object[pagesSize][];
erweitert werden, womit sich die Frage erledigt,
wobei man sowieso sagen kann, dass es [][pagesSize] nirgendwo je geben kann

das Cast-Problem ist hier Generics-unabhängig,
ein Object[] kann man nicht in String[] casten und genauso nicht in ein Array jedes anderen Typs außer Object,
und Object[] ist genauso ein nicht erlaubter Typ != Object

Object[] ! -> Object[][]
ist dieselbe Regel wie
Object[] ! -> String[]

über diese Regel kann man allgemein streiten, ob Java die nur als Sicherheit verbietet?
denn Schabernack kann man in die andere Richtung genauso treiben:
Java:
        Object[] p = new Object[3][4];
        p[0] = new Integer(2);
 
T

Tomate_Salat

Gast
> T dürfte niemals etwas anderes sein als vom Typ java.lang.Object.
wieso? wird doch nur intern verwendet, da klappt schon alles,

Vereinfach:
Java:
public static void main(final String[] args) 
{
	File[] test=(File[]) new Object[2];
}

führt zu:
Code:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.io.File;
	at de.Test.main(Test.java:9)

wie ich geschrieben habe: man bekommt mind. eine ClassCastException ;-).

das ganze mal ergänzend zu deiner Aussage:

ein Object[] kann man nicht in String[] casten und genauso nicht in ein Array jedes anderen Typs außer Object,
und Object[] ist genauso ein nicht erlaubter Typ != Object
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
vereinfacht ist bei dir 'Weglassen von Generics'? ;)
dass normale Casts nicht gehen habe ich doch selber geschrieben, "ein Object[] kann man nicht in String[] casten",
da gibts nicht viel zu ergänzen,

aber Generics ist was anderes, abgesehen von dem wie gesagt Generics-unabhängigen Dimensionsproblem
klappt es mit Generics wunderbar:
Java:
public class Test {
    public static void main(String[] args)  {
        PagedArrayList<String> a = new PagedArrayList<String>("test");
    }

    static class PagedArrayList<T>  {
        private T[] pages;

        public PagedArrayList(T t)   {
            pages = (T[])new Object[5];
            pages[0] = t;
            T a = pages[0];
            System.out.println(a);
        }
    }
}
denn zur Laufzeit fallen Generics weg, normales Object[]
 

Ähnliche Java Themen

Neue Themen


Oben