Fehler bei Reflection

Kennt sich jemand gut mit Reflection aus und weiß wie das geht?

Daten:

class Data implements Serializable {
//...
    double[] minMaxAndAvg = new double[9];
//...
}

Thread:

    DefaultTableModel tm2 = new DefaultTableModel(new String[]{"Name", "Value"}, 24);
//...
                            int i = 0;
                            for (Field declaredField : data.getClass().getDeclaredFields()) {
                                add(i++, declaredField.getName(), declaredField.get(data));
                            }
//...
            void add(int index, String name, Object value) {
                if (value == null) {
                    addTm2Value(index, name, "null");
                } else {
                    if (value.getClass().isArray()) {
                        addTm2Value(index, name, Arrays.toString((Object[]) value)); /* Hier tritt ein Fehler auf... */
                    } else if (value instanceof Collection) {
                        addTm2Value(index, name, ((Collection) value).size());
                    } else if (value instanceof Map) {
                        addTm2Value(index, name, ((Map) value).size());
                    } else {
                        addTm2Value(index, name, value.toString());
                    }
                }
            }
//...
    void addTm2Value(int index, String name, Object value) {
        tm2.setValueAt(name, index, 0);
        tm2.setValueAt(value, index, 1);
        tm2.fireTableDataChanged();
    }

Fehler:

Exception in thread "Thread-2" java.lang.ClassCastException: [D cannot be cast to [Ljava.lang.Object;
//...

Ein double Array ist nunmal ein double Array und kein Object array.
Mit Double[] würde es gehen.
Du hättest das ganze auch mal hart programmieren können, dann würde der Compiler schon meckern

double[] d=new double[10];
Object[] obj=(Object[])d;

Object[] ist nicht gleichzusetzen mit Object, also dass du alle Arrays zu Object[] casten kannst.

 double[] d=new double[10];
 Object obj=d;

geht wiederrum, weil ja alles Objekte sind

Danke, mit einem Cast nach double hat es, ohne Exception, funktioniert:

Wäre nur die Frage, wenn ich in Data z. B. auch andere Arrays als double hätte…

Du könntest, wenn es sich um ein Array handelt mit

Object[].class.isAssignableFrom(array.getClass())

überprüfen ob es ein “primitives” Array (double[], int[] etc. (in dem Fall wird false zurückgegeben)) ist und entsprechend mit

array.getClass().equals(double[].class)

usw. überprüfen und casten.

1 Like