2016-05-30 10 views
3

Ich habe FunktionReturn-Klasse-Typ und haben Klassentyp als Parameter

private Class readObject (ObjectInput in, Class objectclass){ 
    try { 
     Object o = in.readObject(); 

     if (o instanceof objectclass) { 
      return (objectclass)o; 
     } 

    } catch (Exception e) { 

} 

In meiner Klasse ich diese Funktion anzurufenden mit:

ObjectInput in = (..) 
Type1 type = readObject (in, Type1.class); 
(do something with type) 
while(true){ 
    Type2 type2 = readObject (in, Type2.class); 
    (do something with type2) 

Grundsätzlich ist readObject- soll die Klasse zurückzukehren, die ich habe als Parameter, wenn das der richtige Objekttyp ist o. Sie können sich das so vorstellen, als ob ich Type1-, Type2- und Type3-Objekte lese, die ich gerade lese, aber wenn ich auf Typ3 stoße, tue ich nichts.

Dieser Code, den ich geschrieben habe, funktioniert nicht richtig. Zum Beispiel

gibt mir die Warnung "kann nicht von Klasse zu Type1 konvertieren".

+0

Haben Sie drei verschiedene Klassen genannt ' Class', 'Type1' und' Type2'? – Gendarme

+0

Type1 und Type2 sind Klassen ja. "Klasse" ist meine Art zu versuchen, eine Klasse zurückzugeben. Ich versuchte auch Klasse und Klasse , scheint nicht zu helfen – hokosha

+0

Da der Rückgabetyp eine Instanz von 'Type1' oder' Type2' sein muss, aber Sie eine Instanz von 'Class' zurückgeben – Clayn

Antwort

8

Sie sollten Ihre Methode generisch und geben eine Instanz von T (statt einer Instanz von Class<T>) machen:

private <T> T readObject (ObjectInput in, Class<T> objectclass) 

EDIT: Sie sollten auch ändern Sie Ihre if und Ihre Stimmen, wie folgt:

if (objectclass.isInstance(o)) { 
    return (T) o; 
} 
+0

Ich habe das versucht. 'return (objectclass) o;' funktioniert nicht – hokosha

+0

@hokosha Was ist mit 'return (Class ) o;'? – StephaneM

+0

Sie sollten in "T" umwandeln, so: 'return (T) o;' –

3

Sie haben 2 Dinge zu tun:

  1. Ändern Sie die Signatur Ihrer Methode als nächste:

    private <T> T readObject (ObjectInput in, Class<T> objectclass) {

  2. Werfen Sie Ihre Objekt dynamisch Class.cast als nächstes unter Verwendung:

    return objectclass.cast(o);

Verwandte Themen