2016-05-14 5 views
0

Ich erhalte einen „Ungeprüfte oder unsichere Operationen“ Fehler bei dieser Methode:Ungeprüfter oder unsichere Operationen bei Object

public static MyClass initApp(){ 
     MyClass obj = new MyClass(); 
     try{ 
      ObjectInputStream oin = 
       new ObjectInputStream(new FileInputStream("file.dat")); 

      obj.setSomeList ((Map<String,MyOtherClass>) oin.readObject()); //error line 

     }catch(IOException e) 
      { System.out.println(e.getMessage()); } 
     catch(ClassNotFoundException e) 
      { System.out.println(e.getMessage()); } 

     return obj; 
    } 

Karte ist nicht die abstrakt wie möglich in diesem Fall? Wie kann ich das lösen?

Methode setSomeList (Hinweis: Es ist in einer anderen Klasse platziert Wenn das hilft!):

public void setSomeList(Map<String,MyOtherClass> l){ 
     for(Map.Entry<String,MyOtherClass> entrada : l.entrySet()) 
      someList.put(entrada.getKey(),entrada.getValue().clone()); 
    } 
+2

Im Moment nehmen Sie nur an, dass das aus dem Stream gelesene Objekt eine Map ist. Sie sollten die Klasse des gelesenen Objekts vor dem Casting überprüfen. – CConard96

+0

@ CConard96 Wie kann ich das in ObjectInputStream "Umgebung" tun? –

+0

idk was geht durch Ihren Verstand, aber warum Sie versuchen, oin.readObject(), können Sie mir sagen, – emotionlessbananas

Antwort

0

Es ist nur eine Warnung, können Sie ignorieren es einfach, wie es, wenn Sie nicht Ihre Anwendung verhindern zu arbeiten, wenn es nicht die richtige Art ist, um es entfernen wollen einfach @SuppressWarnings("unchecked") bei der Methodendefinition Ebene hinzufügen , wie unten:

@SuppressWarnings("unchecked") 
public static MyClass initApp(){ 
+0

Gibt es keinen anderen Weg? –

+1

Nein, weil Sie ein Objekt in eine Map konvertieren, ist es Teil des Compiler-Jobs, Sie zu warnen, dass es scheitern könnte, aber wenn Sie wissen, dass es sicher ist, fügen Sie einfach eine Warnung hinzu, es ist eine Art zu sagen, kein Problem, ich Ich weiß, was ich tue –

1

sollten Sie die Objekte des Typs überprüfen vor dem Gießen.

Object theObject = obj.readObject(); 
if (theObject instanceof Map) 
{ 
    Map theMap = (Map) theObject; 
    objSetSomeList(theMap); 
} 
+0

Es hat nicht funktioniert ... (selbe Warnung) –

+1

Es gibt keine Möglichkeit, die Typen der Schlüssel oder Werte an diesem Punkt im Code zu überprüfen, weil der Typ gelöscht wurde. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/7335018/cannot-perform-instanceof-check-against-parameterized-type-arraylistfoo. Am besten können Sie in die generische Map umwandeln, den ersten Eintrag abrufen, Schlüsseltypen und Werte mit instanceof prüfen. – CConard96

+0

Ok, verstanden. Danke;) –

Verwandte Themen