2013-08-02, 11:15
  #1
Medlem
john13371337s avatar
Obs! Flashback editorn tar bort vissa tecken av nn anledning, s jag bytte > och < mot *

Hoppas det r tydligt vad jag menar nd.

Kod:
public interface Foo*T extends Comparable*T** {
//..
}
Kod:
public class FooImpl*T extends Comparable*T** implements Foo*T* {
         //...
         private T[] data;

         public FooImpl(int capacity) {
                 // 1
                 // data = new T[capacity];  // detta funkar inte (vid kompilering)

                // 2
                 data = (T[]) new Comparable[capacity];  // detta fungerar

                // 3
                // data = (T[]) Array.newInstance(T.class, capacity); // kompileringsfel


I konstruktorn fungerar inte den frsta lsningen, "cannot create generic array of T", vilken som jag har frsttt det beror p hur generics r implementerade i java.

Den andra lsningen fungerar, men jag undrar om jag kan stta p ngra problem med det tillvgagngssttet.

Den tredje lsningen anvnder java reflection api och borde funka, men jag kan inte komma t "class" fltet i den generiska klassen T. "Illegal class literal for the type parameter T" r felmeddelandet.
Denna metod har signaturen

public static newInstance(Class*?* componentType,int length)s problemet r allts den frsta parametern

Frgan r vl egentligen hur man br lsa det hr problemet p bsta stt.
__________________
Senast redigerad av john13371337 2013-08-02 kl. 11:39.
Citera
2013-08-02, 13:37
  #2
Medlem
dethalvabarnets avatar
Hmm? du kan gra likadant med alla andra klasser som finns som du gr med Comparable[capacity] dr.

Citat:
Ursprungligen postat av http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html
Cannot Create Arrays of Parameterized Types

You cannot create arrays of parameterized types. For example, the following code does not compile:

List<Integer>[] arrayOfLists = new List<Integer>[2]; // compile-time error

The following code illustrates what happens when different types are inserted into an array:

Object[] strings = new String[2];
strings[0] = "hi"; // OK
strings[1] = 100; // An ArrayStoreException is thrown.

If you try the same thing with a generic list, there would be a problem:

Object[] stringLists = new List<String>[]; // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>(); // OK
stringLists[1] = new ArrayList<Integer>(); // An ArrayStoreException should be thrown,
// but the runtime can't detect it.

If arrays of parameterized lists were allowed, the previous code would fail to throw the desired ArrayStoreException.
Citera
2013-08-02, 13:47
  #3
Medlem
Mr.Svenssons avatar
Citat:
Ursprungligen postat av john13371337
Obs! Flashback editorn tar bort vissa tecken av nn anledning, s jag bytte > och < mot *

Hoppas det r tydligt vad jag menar nd.

Kod:
public interface Foo*T extends Comparable*T** {
//..
}
Kod:
public class FooImpl*T extends Comparable*T** implements Foo*T* {
         //...
         private T[] data;

         public FooImpl(int capacity) {
                 // 1
                 // data = new T[capacity];  // detta funkar inte (vid kompilering)

                // 2
                 data = (T[]) new Comparable[capacity];  // detta fungerar

                // 3
                // data = (T[]) Array.newInstance(T.class, capacity); // kompileringsfel


I konstruktorn fungerar inte den frsta lsningen, "cannot create generic array of T", vilken som jag har frsttt det beror p hur generics r implementerade i java.

Den andra lsningen fungerar, men jag undrar om jag kan stta p ngra problem med det tillvgagngssttet.

Den tredje lsningen anvnder java reflection api och borde funka, men jag kan inte komma t "class" fltet i den generiska klassen T. "Illegal class literal for the type parameter T" r felmeddelandet.
Denna metod har signaturen

public static newInstance(Class*?* componentType,int length)s problemet r allts den frsta parametern

Frgan r vl egentligen hur man br lsa det hr problemet p bsta stt.

Jag skulle tro att den tredje lsningen inte fungerar av samma anledning som frsta, dvs beror p hur generics r implementerade i Java. Vid kompilering frsvinner all generisk typ information och
fr att den frsta och sista lsningen ska fungera, krvs denna typ information som inte finns nr programmet krs vilket gr att programmet inte gr att kompilera.

Om du vill att den tredje lsningen ska fungera fr du ha en parameter till konstruktorn som tar in typen som du sedan anvnder som parameter till Array.newInstance... Ungefr s hr:
Kod:
import java.lang.reflect.Array;

public class 
Foo<T> {
    private 
T[] data;
    
    public 
Foo(Class<Ttypeint capacity) {
        
data = (T[])Array.newInstance(typecapacity);
    }


S lnge du inte returnerar den interna arrayen utanfr klassen s r den andra lsningen typsker (och verkar vara den lsning som rekommenderas om du sker p internet) och krver inte en extra parameter som kan anses vara "fult"
Citera
2013-08-02, 16:39
  #4
Medlem
john13371337s avatar
Okej, tack fr svar. ven om svaret var lite trkigare n jag hoppats p
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in