2016-11-21 2 views
0

Ich bin mit einem Downcasting-Problem mit Java fest.Problem mit Downcasting Bild

Hier ist das Diagramm: Die Klasse MyPicture erweitert die abstrakte Klasse BufferedImage. Der Punkt ist, ein paar Methoden zu BufferedImage hinzuzufügen. Dann habe ich die Klasse MyWindow, die ein benutzerfreundliches Fenster setzt. In dieser Klasse möchte ich ein Bild in MyPic laden, es in MyPic_filtered kopieren, eine Methode verwenden, die in MyPicture auf MyPic_filtered verwendet wird und schließlich MyPic und MyPic_filtered in getrennten Fenstern anzeigen (aber dieser letzte Teil ist OK ^^). Ich weiß nicht, welche Typen ich für MyPic und MyPic_filtered verwenden sollte. Ich habe versucht, sie in der richtigen Art zu werfen, es baut, aber nicht läuft. Hier

ist der Code:

//Loading the picture 
BufferedImage MyPic = ImageIO.read(new File(URL)); //URL is a string 
//Copy the picture 
MyPicture myPic_filtered = myPic;    
//Use the method from MyPicture 
myPic_filtered.method_from_MyPicture();` 

Könnte mir bitte jemand helfen?

+1

'ImageIO.read()' gibt kein 'MyPicture' zurück. Sie können ein Objekt nicht magisch in einen Typ verwandeln, der es nicht ist. – SLaks

+1

Auch Java unterscheidet zwischen Groß- und Kleinschreibung, also 'MyPic! = MyPic' – QBrute

+0

* Die Klasse' MyPicture' erweitert die abstrakte Klasse 'BufferedImage' * ... Diese Aussage ist falsch. 'BufferedImage' ist nicht abstrakt. Es gibt im Allgemeinen keine Notwendigkeit, es zu erweitern, und ich würde dagegen raten. Verwenden Sie Delegierung statt Vererbung. – haraldK

Antwort

0

Sie können einen Caster hinzufügen, wenn Sie versuchen, eine Basisklasse-Instanz erweitert man passieren, wie:

MyPicture myPic_filtered = (MyPicture)myPic; 

Dann können Sie „MyPic“ zugreifen, indem Sie dieses Schlüsselwort.


Oder vielleicht müssen Sie das BufferedImage nicht erweitern. Nur behandeln BufferedImage als Instanzvariable, wie:

class MyPicture { 
    BufferedImage bi; 
    //other variables 
    ......; 

    public MyPicture(BufferedImage input) { 
      this.bi = input; 
    } 

    public BufferedImage method_from_MyPicture() { 
     //Do something with bi and output 
     ........ 
    } 
} 

nicht sicher, welche Struktur besser ist. Aber es löst das Problem in jeder Hinsicht.