@groovy.transform.TypeChecked
abstract class Entity {
...
double getMass() {
...
}
...
}
@groovy.transform.TypeChecked
abstract class Location {
...
Entity[] getContent() {
...
}
...
}
@groovy.transform.TypeChecked
abstract class Container {...} //inherits, somehow, from both Location and Entity
@groovy.transform.TypeChecked
class Main {
void main() {
double x
Container c = new Chest() //Chest extends Container
Entity e = c
x = e.mass
Location l = c
x = l.content //Programmer error, should throw compile-time error
}
}
По сути, есть способ добиться этого, не жертвуя каким-либо из трех свойств, описанных в main()
:
- Прямой доступ к полям, даже к виртуальным полям
- Отнесение к обоим суперклассам
- Проверка типов (во время компиляции)