java - Generic Types & the toArrayMethod -



java - Generic Types & the toArrayMethod -

i have class mystack<t> defines following

public t[] toarray(){ int s=size(); @suppresswarnings("unchecked") t[] result=(t[])new object[s]; node n=first; (int i=0; i<s; i++){ result[i]=n.data; n=n.next; } homecoming result; }

since returns array of type t, think if declared instance: mystack<string> s=new mystack<>, next valid: string[] test=s.toarray(). think because since s of type string, toarray should homecoming array of type string, since string has been substituted in every t in class (only particular instantiation, know). way runs without errors if this: object[] test=s.toarray().

why this?

well, hold on minute. suppose hypothesis right string substituted every t.

would next cast valid?

string[] result = (string[])new object[s];

no, not. can sure new object[] not string[].

now see (t[])new object[n] works because cast becomes erased within generic class. (it deceptive idiom.)

when class gets compiled, happens references t replaced upper bound (probably object unless had <t extends ...>):

public object[] toarray(){ int s=size(); object[] result=new object[s]; node n=first; (int i=0; i<s; i++){ result[i]=n.data; n=n.next; } homecoming result; }

and cast moved phone call site:

mystack stack = new mystack(); string[] arr = (string[])stack.toarray();

so in fact, while cast erased within class, cast happen 1 time value returned outside class, classcastexception thrown.

the inability instantiate arrays (and objects in general) generically why collections framework defines toarray method take homecoming array argument. simple version of following:

public t[] toarray(t[] inarray){ int s = size(); node n = first; (int = 0; < s; i++){ inarray[i] = n.data; n = n.next; } homecoming inarray; }

for ideas on how create array generically, may see 'how create generic array in java?'; need caller pass argument method.

java generics types casting

Comments

Popular posts from this blog

Delphi change the assembly code of a running process -

json - Hibernate and Jackson (java.lang.IllegalStateException: Cannot call sendError() after the response has been committed) -

C++ 11 "class" keyword -