E02030: duplicate/ambiguous methods/operations
What went wrong
Two or more methods have the same signature (name + parameter types). Method overloading requires different parameter types, not just different names.
Two spellings of ONE operator are the same method: unary '-' and '~' are both negation. A type may declare it once, with one spelling, and a sub-type spells an operator it inherits the way its parent does ('override operator ~' below a '~'), or it declares the same operator again without overriding it. Two parents (two traits, or a super and a trait) must spell it the same way too.
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 1069 (Can I use default operator and also define my own operato...)
- ek9 -q 949 (What are the rules for using 'default operator' in EK9?)
How to fix it
- Remove the duplicate method definition
- Change parameter types to create a distinct overload
- Rename one method if different behavior is needed
- For unary '-' and '~': keep one of them; in a sub-type, use the parent's spelling with 'override'; across two parents, spell it one way in both
Common causes
- Copy-paste creating duplicate method definitions
- Forgetting a method with same signature already exists
- Overloaded methods that accidentally have identical signatures
- Declaring both unary '-' and '~' (one operator, negation), in one type or across a type and its super or trait, or across two of its parents
See also
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E02030: duplicate/ambiguous methods/operations
#!ek9 defines module error.e02030.bad defines class Calculator add() -> first as Integer second as Integer <- rtn as Integer: first + second //Same name, same parameter types: a duplicate, whatever the body does add() -> first as Integer second as Integer <- rtn as Integer: first + second + 1
Fixed: Give the second method a name that says what it does differently
#!ek9 defines module error.e02030.good defines class Calculator addWithBonus() -> first as Integer second as Integer <- rtn as Integer: first + second + 1 add() -> first as Integer second as Integer <- rtn as Integer: first + second
Fixed: Or overload it: the same name with different parameter types is a different method
#!ek9 defines module error.e02030.good.overload defines class Calculator add() -> first as Integer second as Integer <- rtn as Integer: first + second add() -> first as Float second as Float <- rtn as Float: first + second
Questions and answers
These Q&A entries show E02030 and its fix: