On 06.06.20 06:57, Paul King wrote:
Here is a good example for your point Jochen:
///////////////////
@groovy.transform.TypeChecked
def method() {
def component = new Random().nextBoolean() ? new ArrayDeque() : new Stack()
component.clear() // 'clear' in LUB (AbstractCollection or Serializable or
Cloneable)
if (component instanceof ArrayDeque) {
component.addFirst(1) // 'addFirst' only in ArrayDeque
} else if (component instanceof Stack) {
component.addElement(2) // 'addElement' only in Stack
}
if (component instanceof ArrayDeque || component instanceof Number) {
// checked duck typing
assert component.peek() in 1..2 // 'peek' in ArrayDeque and Stack but
not LUB
}
}
method()
///////////////////
I guess
if (component instanceof ArrayDeque || component instanceof Number) {
is really
if (component instanceof ArrayDeque || component instanceof Stack) {
The peek() case is what you call LUBU. I am still not sure what the best
name is.
This is where we'd need either an invokedynamic or smarter multi-branch
logic with several alternative invokevirtual paths.
I would go with invokedynamic. That is better for debugging and code
coverage tools.
bye Jochen