Scala: Substituindo Métodos Java Genéricos II
No Scala, preciso substituir o seguinte, dado, classes e métodos Java:
public abstract class AbstractJava<T> {
protected abstract T test(Class<? extends T> clazz);
}
public class ConcreteJava extends AbstractJava<Object> {
@Override
protected Object test(Class<?> clazz) {
return null;
}
}
// Scala
class ConcreteScala extends ConcreteJava {
protected override def test(clazz: Class[_ <: AnyRef]): AnyRef =
super.test(clazz)
}
Estou recebendo o erro de compilação:
error: ambiguous reference to overloaded definition,
both method test in class ConcreteJava of type
(clazz: java.lang.Class[_])java.lang.Object
and method test in class AbstractJava of type
(clazz: java.lang.Class[_ <: java.lang.Object])java.lang.Object
match argument types (Class[_$1]) and expected result type AnyRef
super.test(clazz)
Eu não esperaria que o compilador Scala se referisse a umabstract
em umsuper
ligar. Além disso, eu esperaria que ele se referisse ao direct super classe primeiro.
Como posso fazer a classe Scala compilar?
Obrigado
Editar
Quando deixar osuper.test(clazz)
call, haverá a mensagem de erro:
error: name clash between defined and inherited member:
method test:(clazz: Class[_ <: AnyRef])AnyRef and
method test:(clazz: java.lang.Class[_])java.lang.Object in class ConcreteJava
have same type after erasure: (clazz: java.lang.Class)java.lang.Object
protected override def test(clazz: Class[_ <: AnyRef]): AnyRef = null
Bem,clar estes são os mesmos tipos (ou variantes) ...! - Então, há algo errado com a herança Scala / Java ...
Graças a michid, há uma solução preliminar:
class ConcreteScala3 {
this: ConcreteJava =>
protected override def test(clazz: Class[_ <: AnyRef]): AnyRef = {
this.foo() // method of ConcreteJava
null
}
}
embora não possamos fazersuper
chamadas daqui.
s respostas ainda são bem-vinda