# Objekt Typ herausfinden



## cable545 (29. Nov 2011)

Hallo,
ich lese aus einem ObjectInputStream ein Objekt. Nun muss ich herausfinden von welchem Typ das Objekt ist. Möglich sind die von mir selbst definierten Typen TextMessage sowie UserListMessage. Beide Message Typen erben von meiner abstrakten Klasse Message. Gibt es irgendeine Technik wie ich bei meinem Problem vorgehen muss? Bin da gerade ein bißchen ratlos.


----------



## Michael... (29. Nov 2011)

Grundsätzlich bietet jedes Objekt die Methode getClass() welche die konkrete Klasse zurück gibt.
Um zu überprüfen, ob ein Objekt eine Instanz einer bestimmten Klasse ist gibt es 
	
	
	
	





```
instanceof
```
z.B.

```
if (object instanceof Message)
```


----------



## faetzminator (29. Nov 2011)

Eigentlich sollte so was durch schöne Vererbung nicht passieren, aber hier trotzdem zwei Ansätze:

```
if (someObj != null && someObj.getClass().equals(SomeClass.class)) {
    // ...
}
```
oder 
	
	
	
	





```
if (someObj instanceof SomeClass) {
    // ...
}
```


----------



## cable545 (29. Nov 2011)

Was hat das in diesem Fall mit schöner Vererbung zu tun? Mein ObjectInputStream liefert mir ein Objekt der Klasse Object. Was hätte ich denn in diesem Fall anders machen können? 
Euch beiden trotzdem vielen Dank für die schnelle Antwort. Gleich mal ausprobieren.


----------



## faetzminator (29. Nov 2011)

Wenn du in Message den Typen zurückgeben kannst, dann kann man das auch ohne irgendeinen instanceof-Test etwa wie folgt lösen:

```
Message message = (Message) someObj;
switch(message.getType()) {
    case MessageType.TEXT: // mit einem Enum als Beispiel
        doSomethingWithText((TextMessage) message);
        break;
    case Type.USER_LIST:
        doSomethingWithUserList((UserListMessage) message);
        break;
    default:
        throw new IllegalArgumentException("jaja was auch immer");
}
```

Edit: noch schöner wär natürlich, wenn diese Messages eine Methode wie [c]doSomething()[/c] implementieren würden. Dann musst du - unabhängig davon was für eine konkrete Klasse es ist - nur diese Methode aufrufen. Aber es ist mir bewusst, dass es in vielen Fällen nicht so einfach ist...


----------



## bygones (29. Nov 2011)

cable545 hat gesagt.:


> Was hat das in diesem Fall mit schöner Vererbung zu tun? Mein ObjectInputStream liefert mir ein Objekt der Klasse Object. Was hätte ich denn in diesem Fall anders machen können?
> Euch beiden trotzdem vielen Dank für die schnelle Antwort. Gleich mal ausprobieren.



einfach das kommende Objekt zu Message casten und die gewuenschten Methoden aufrufen. Was dann die jeweiligen Implementierungen machen ist ja egal.


----------

