2013-06-14 1 views
1

Я не уверен, как исправить это, так как мой код String [], а не Object [] Как я могу исправить эту ошибку?Как я могу исправить эту ошибку java.lang.Object [] не может быть добавлен в java.lang.String []?

Вот S полный LogCat:

06-14 00:25:40.356: W/dalvikvm(13023): threadid=1: thread exiting with uncaught exception (group=0x40aa41f8) 
06-14 00:25:40.356: E/AndroidRuntime(13023): FATAL EXCEPTION: main 
06-14 00:25:40.356: E/AndroidRuntime(13023): java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[] 
06-14 00:25:40.356: E/AndroidRuntime(13023): at com.example.drawingarrays.OutPutConversion.Out(OutPutConversion.java:7) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at com.example.drawingarrays.MainActivity.onClick(MainActivity.java:64) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at android.view.View.performClick(View.java:3540) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at android.view.View$PerformClick.run(View.java:14167) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at android.os.Handler.handleCallback(Handler.java:605) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at android.os.Looper.loop(Looper.java:137) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at android.app.ActivityThread.main(ActivityThread.java:4586) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at java.lang.reflect.Method.invokeNative(Native Method) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at java.lang.reflect.Method.invoke(Method.java:511) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-14 00:25:40.356: E/AndroidRuntime(13023): at dalvik.system.NativeStart.main(Native Method) 

Вот мой код:

public class OutPutConversion { 
DrawingTools GAL = new DrawingTools(); 

public void Out() { 
    String[] Result = (String[]) GAL.getAL().toArray(); 
    float[] vertices = new float[Result.length]; 
    for (int i = 0; i < vertices.length; i++) { 
     vertices[i] = Float.valueOf(Result[i]); 

    } 
    } 
} 

Вот DrawingTools Класс:

public class DrawingTools { 
ArrayList<String> AL = new ArrayList<String>(); 

public ArrayList<String> getAL() { 
    return AL; 
} 

public void AddLine(String Input1) { 
    String[] pStrings = Input1.split(","); 
    for (int i = 0; i < pStrings.length; i++) { 
     AL.add(pStrings[i]); 
    } 

} 

ответ

2

GAL.getAL() возвращает ArrayList<String>, тем не менее ArrayList.toArray() возвращает Object [] независимо от его общего типа (см. API), и вы не можете t it to String [], попробуйте GAL.getAL().toArray(new String[0]) вместо

+0

Я обновил вопрос другим классом, на который вы ссылаетесь. –

+0

OK. исправил мой ответ –

0

Вы не можете отличить весь массив, поэтому вам нужно его преобразовать или соответствующим образом выполнить его в цикле. Или в этом случае вообще нет.

public void Out() { 
    Object[] Result = GAL.getAL().toArray(); 
    float[] vertices = new float[Result.length]; 
    for (int i = 0; i < vertices.length; i++) { 
     vertices[i] = Float.valueOf(Result[i].toString()); 

    } 
} 
0

Массивы не следуют правилам наследования их элементов. Тот факт, что String распространяется на Object, не означает, что String[] распространяет Object[].

Для того, чтобы «отличить» от Object[] до String[], вам нужно создать новый массив строк, перебрать элементы массива объектов и скопировать элемент-по-элементу с точностью до того, как вы сделаете это для float.

так, проще исправить ваш код просто сделать следующее:

Object[] Result = GAL.getAL().toArray(); 
float[] vertices = new float[Result.length]; 
for (int i = 0; i < vertices.length; i++) { 
    vertices[i] = Float.valueOf(String.valuOf(Result[i])); 
} 

Однако, насколько я понимаю, getAL() метод возвращает Collection<String>. Таким образом, вы можете:

String[] Result = GAL.getAL().toArray(new String[0]); 
    float[] vertices = new float[Result.length]; 
    for (int i = 0; i < vertices.length; i++) { 
     vertices[i] = Float.valueOf(Result[i]); 
    } 

или даже непосредственно итерацию коллекции:

Collection<String> Result = GAL.getAL(); 
float[] vertices = new float[Result.size()]; 
for (int i = 0; i < vertices.length; i++) { 
    vertices[i] = Float.valueOf(Result[i]); 
} 

И последний совет. В java есть соглашение об именах. Все имена переменных и методов начинаются с маленькой буквы. Все имена классов начинаются с заглавной буквы. Начните следовать этому соглашению сейчас. В противном случае ваш код будет нечитаемым.

+0

Спасибо за отзыв, я не понимал, что существуют соглашения об именах –