59 lines
1.6 KiB
Markdown
59 lines
1.6 KiB
Markdown
- Возможность вызвать метод определяется по типу ссылки
|
||
- Ссылку нельзя привести к произвольному типу
|
||
- Сслыку можно привести к более общему типу
|
||
- Ссылку можно привести к реальному типу объекта
|
||
- Оператор `instanceof` проверяет тип объекта
|
||
## Оператор `instanceof`
|
||
```Java
|
||
// ColorSquare extends Square
|
||
ColorSquare s = new ColorSquare();
|
||
s instanceof ColorSquare // true
|
||
s instanceof Square // true
|
||
s instanceof String // false
|
||
```
|
||
## Upcasting
|
||
Приведение к суперклассу
|
||
```Java
|
||
Square x = s;
|
||
x.area(); // OK
|
||
x.getColor(); // Ошибка - нет такого метода
|
||
```
|
||
## Downcasting
|
||
Приведение к реальному типу
|
||
|
||
Если изначально был таким
|
||
```Java
|
||
ColorSquare s = new ColorSquare();
|
||
Square x = s;
|
||
x.area(); // OK
|
||
|
||
ColorSquare y = (ColorSquare) x;
|
||
y.getColor(); // OK
|
||
```
|
||
А вот если нет
|
||
```Java
|
||
Square s = new ColorSquare();
|
||
Square x = s;
|
||
x.area(); // OK
|
||
|
||
ColorSquare y = (ColorSquare) x;
|
||
// ClassCastException
|
||
```
|
||
## Pattern Matching
|
||
Перед даункастом лучше проверить тип через `instanceof`
|
||
```Java
|
||
...
|
||
if (x instanceof ColorSquare) {
|
||
ColorSquare y = (ColorSquare) x;
|
||
y.getColor(); // OK
|
||
}
|
||
```
|
||
Либо более короткий синтаксис
|
||
```Java
|
||
...
|
||
if (x instanceof Colorsquare y) {
|
||
y.getColor(); // OK
|
||
}
|
||
```
|
||
|
||
То есть после апкаста джава не забывает какой тип был изначально |