Groovy - как против (литой)
Есть ли практическая разница между следующими двумя подходами к кастингу:
result.count = (int) response['hits']['total']
против
result.count = response['hits']['total'] as int
я использую @CompileStatic
и компилятор хочет, чтобы я выполнил приведение - что заставило меня задуматься, есть ли какая-либо производительность или практическая разница между этими двумя обозначениями.
1 ответ
Основное различие заключается в том, что кастинг использует концепцию наследования для преобразования, где as
Оператор - это пользовательский конвертер, который может использовать или не использовать понятия наследования.
Какой из них быстрее?
Это зависит от реализации метода конвертера.
Кастинг
Ну, на самом деле все приведение типов означает, что вы берете Объект одного определенного типа и "превращаете его" в другой тип Объекта. Этот процесс называется приведением переменной.
Например:
Object object = new Car();
Car car = (Car)object;
Как мы видим на примере, мы приводим объект класса Object
в Car
потому что мы знаем, что объект является экземпляром Car
в глубине души.
Но мы не можем сделать это, если Car
это подкласс Bicycle
что на самом деле не имеет никакого смысла (вы получите ClassCastException
в этом случае):
Object object = new Car();
Bicycle bicycle = (Bicycle)object;
as
оператор
В Groovy мы можем переопределить метод asType() для преобразования объекта в другой тип. Мы можем использовать метод asType() в нашем коде для вызова преобразования, но мы можем даже сделать его короче и использовать как.
В заводной as
Оператор левого операнда должен реализовать этот метод:
Object asType(Class clazz) {
//code here
}
Как видите, метод принимает экземпляр Class
и реализует пользовательский конвертер, так что в основном вы можете конвертировать Object
в Car
или же Car
в Bicycle
если вы хотите, все зависит от вашей реализации.