При приведении не происходит никакого преобразования или преобразования объекта. Просто представьте, что у вас следующая структура класса:
class Mammal { }
class Human extends Mammal { }
class Dog extends Mammal { }
Теперь, когда вы создаете новый экземпляр Human с Human human = new Human();
, это тоже будет Млекопитающее, верно? Таким образом, вы можете написать метод вроде:
public void doSoemthing(Mammal mammal) {
if (mammal instanceof Human) {
Human human = (Human) mammal;
human.doWork();
} else if (mammal instanceof Dog) {
Dog dog = (Dog) mammal;
dog.bark();
}
}
и вызвать метод: можно проверить, что это за млекопитающее. Поэтому, когда вы передаете new Human()
в качестве входных данных, фактическим типом объекта будет Human. Причина, по которой вы можете передать Человека методу, ожидающему Млекопитающее, заключается в наследовании. Итак, ваш метод будет знать, что входной параметр определенно является млекопитающим. Но это может быть любой вид млекопитающего. Если вы хотите узнать, что является типом Объекта, вы можете использовать instanceof
, например. И в этой строке:
Human human = (Human) mammal;
не означает, что вы конвертируете входной параметр млекопитающего. Это просто означает, что теперь вы хотите использовать входной параметр в качестве человека. И вы можете сделать это, потому что с течением времени вы проверяете, что это действительно человек. Вы также можете сделать что-то вроде этого:
public void doExample2(Object input) {
if (input instanceof Integer) {
System.out.println("I am a number");
} else if (input instanceof Graphics) {
System.out.println("I am a Graphics");
}
}
Обратите внимание на тип входного параметра. Объект - это базовый класс всего.
Итак, вернемся к вашему сценарию. Вы выполняете это приведение, потому что из контекста вашего приложения входным параметром всегда будет Graphics2D, и поэтому вы можете выполнять это приведение, а также использовать методы, предоставляемые Graphics2D.