Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

PD

Praktikant

  • "PD" started this thread

Posts: 17

Date of registration: Mar 6th 2002

1

Wednesday, November 12th 2003, 12:33pm

Java Probleme (Cast)

Hallo,
ich möchte in Java folgendes realisieren:

public Object dosomething(Object o, Class c)
{
Object ret = c.newInstance();
ret=((c.getName) o).machwas();
return ret;
}

Hierbei möchte ich nicht o in c casten, sondern in den Typ, den c repräsentiert, (d.h. den man mit c.getName() erhält!).

Ein zusätzliches Problem stellt der Aufruf c.newInstance() dar, wenn die Klasse keinen Standardkonstruktor besitzt.

Ich danke im vorraus für jegliche Tipps und Hilfe.
PD

silence

Junior Schreiberling

Posts: 177

Date of registration: Dec 11th 2001

Location: reagenzglas

Occupation: tellerwäscher

2

Wednesday, November 12th 2003, 5:07pm

RE: Java Probleme (Cast)

Quoted

Original von PD
public Object dosomething(Object o, Class c)
{
Object ret = c.newInstance();
ret=((c.getName) o).machwas();
return ret;
}


Also o gehört zur Klasse c?! Warum benutzt du nicht einfach ein Interface

public interface A {
B machwas();
}

Und schreibst dann:

public B dosomething(A o)
{
A ret = (A) o.getClass().newInstance();
ret=((A) o).machwas();
return ret;
}

Der Compiler muss ja schliesslich wissen, um was für einen Typ es sich hier handelt, damit die Funktion machwas() aufgerufen werden kann. Zur Laufzeit kann das AFAIK nur mit wirklich hässlichen Reflectionkonstrukten, die sehr inperformant sind erledigt werden.

Aber warum in Gottes Namen erzeugst du erst ein Objekt um es gleich wieder zu überschreiben ??? :-)

Quoted

Original von PD
Ein zusätzliches Problem stellt der Aufruf c.newInstance() dar, wenn die Klasse keinen Standardkonstruktor besitzt.


Man kann auch Parameter an Konstruktoren übergeben. Aber auch dies quält den Code mit Reflection und sollte eher vermieden werden.

Sinnvoller ist es, die Klasse mit parameterlosen Konstruktoren auszustatten, die sinnvolle Defaultwerte bereitstellen und dann mit settern die Eigenschaften konkret zu setzen.

Greift man mit Reflection auf Parameterbehaftete Konstruktoren zu, so bekommt man keinen Compilerfehler, wenn man die Signatur ändert. Das kann äusserst ärgerlich sein, wenn dann in dem Codefragment, dass einmal alle 1000 Jahre aufgerufen wird, ein Laufzeitfehler durch soetwas auftritt. ?(
"Wir stecken immer in der Scheisse, nur die Tiefe ändert sich."
(Ein unbekannter Softwareentwickler)

paradroid

Junior Schreiberling

Posts: 231

Date of registration: Feb 28th 2002

3

Thursday, November 13th 2003, 9:59am

RE: Java Probleme (Cast)

Quoted

Original von silence
[...]
Man kann auch Parameter an Konstruktoren übergeben. Aber auch dies quält den Code mit Reflection und sollte eher vermieden werden.
[...]


Java verwendet Reflection, nur um ein paar Parameter an einen Konstruktor zu übergeben?!? Jetzt verabscheue ich Java noch mehr als sowieso schon.

# transmission terminated #

silence

Junior Schreiberling

Posts: 177

Date of registration: Dec 11th 2001

Location: reagenzglas

Occupation: tellerwäscher

4

Thursday, November 13th 2003, 10:58am

RE: Java Probleme (Cast)

Quoted

Original von paradroid
Java verwendet Reflection, nur um ein paar Parameter an einen Konstruktor zu übergeben?!? Jetzt verabscheue ich Java noch mehr als sowieso schon.


Normalerweise nicht, aber wenn man mit newInstance() ein neues Objekt vom Typ C mit Hilfe eines bestimmten Konstruktors, der die Parametertypen A, B benötigt, erzeugen möchte, so kann man

Source code

1
2
Constructor co = C.class.getConstructor(A.class, B.class);
Object c = co.newInstance(a, b);


schreiben.

Das ist zwar ein sehr mächtiges Sprachkonstrukt, aber wie gesagt mit Vorsicht zu geniessen, da es erstens langsamer als ein

Source code

1
Object c = new C(a, b);


ist und zweitens sehr laufzeitfehleranfällig ist, da nun der Compiler nicht mehr prüfen kann, ob überhaupt ein solcher Konstruktor vorhanden ist.
"Wir stecken immer in der Scheisse, nur die Tiefe ändert sich."
(Ein unbekannter Softwareentwickler)

paradroid

Junior Schreiberling

Posts: 231

Date of registration: Feb 28th 2002

5

Friday, November 14th 2003, 10:18am

RE: Java Probleme (Cast)

Ah, ok. Ich hatte schon ernsthaft an der geistigen Gesundheit der Java-Entwickler gezweifelt ;)

# transmission terminated #