質問では、Object doSomething(Class<?> clazz)
メソッドは抽象ジェネリッククラスのabstract T doSomething(Class<? extends T> clazz)
メソッドの実装であるとは言及していませんでした。
だから、実際には、次のしているJavaクラスは、(私は簡潔にするためtest
にdoSomething
に改名):
public abstract class AbstractJava<T> {
protected abstract T test(Class<? extends T> c);
}
public class ConcreteJava extends AbstractJava<Object> {
@Override
protected Object test(Class<?> c) {
return null;
}
}
そして、あなたは以下のScalaのクラスを実装しようとしている。
class ConcreteScala extends ConcreteJava {
override protected def test(c: Class[_]) = super.test(c)
}
をしかし、コンパイルが失敗したときので、 test()
ScalaはConcreteJava.test()
とAbstractJava.test()
のメソッドを異なるシグネチャを持つものとして扱います。
次の回避策が見つかりました。
renameTest()
にそれを「名前の変更」ともconcreteTest()
方法を通じてスーパーConcreteJava.test()
を呼び出す機能を提供test()
をオーバーライドしていることを、追加のJavaクラスを作成します。
public abstract class RenameJava extends ConcreteJava {
public Object concreteTest(Class<?> c) {
return super.test(c);
}
abstract protected Object renameTest(Class<?> c);
@Override
protected Object test(Class<?> c) {
return renameTest(c);
}
}
今
ConcreteScala
クラスにあなたは
renameTest()
を上書きすることができますし、あなたはまだ
concreteTest()
法を用いた超
ConcreteJava.test()
メソッドを呼び出すことができるしています。
class ConcreteScala extends RenameJava {
override protected def renameTest(c: Class[_]) = {
// custom logic
concreteTest(c)
}
}
具体的な「春」のケースでは、次のように実装されています。
RenameGsonHttpMessageConverter.java
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import java.io.IOException;
public abstract class RenameGsonHttpMessageConverter extends GsonHttpMessageConverter {
protected Object superReadInternal(Class<?> clazz, HttpInputMessage inputMessage) throws
IOException, HttpMessageNotReadableException {
return super.readInternal(clazz, inputMessage);
}
abstract protected Object renameReadInternal(Class<?> clazz, HttpInputMessage inputMessage) throws
IOException, HttpMessageNotReadableException;
@Override
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return renameReadInternal(clazz, inputMessage);
}
}
CustomGsonHttpMessageConverter.scala
import org.springframework.http.HttpInputMessage
class CustomGsonHttpMessageConverter extends RenameGsonHttpMessageConverter {
override protected def renameReadInternal(clazz: Class[_], inputMessage: HttpInputMessage) = {
// custom logic
// or you may want to call
superReadInternal(clazz, inputMessage)
}
}
はまた、私はバグレポートSI-10155を作りました。
jdkとscalaのバージョンを教えてください – Odomontois
「def def doSomething [T](clazz:Class [T]):AnyRef'をオーバーライドしようとしましたか? – marstran
'def override doSomething(clazz:Class [_]):AnyRef = ???'はScala 2.11.8とJDK 8u91 –