我正在尝试实现以下 API:
Logger<Widget> logger = new SimpleLogger<Widget>();
// clazz == Widget.class
Class<?> clazz = logger.getLoggerClass();
Logger<Fizz> fizzLogger = new SimpleLogger<Fizz>();
// clazz now equals Fizz.class
clazz = fizzLogger.getLoggerClass();
我有:
public interface Logger<T> {
public T getLoggerClass();
public void setLoggerClass(T clazz);
public void logTrace(String trace);
}
然后SimpleLogger
:
public class SimpleLogger<T> implements Logger<T> {
private Class<?> loggerClass;
@Override
public T getLoggerClass() {
return loggerClass;
}
@Override
public void setLoggerClass(T clazz) {
this.loggerClass = clazz;
}
@Override
public void logTrace(String trace) {
System.out.println("TRACE: " + trace);
}
}
但是在 SimpleLogger
中,在以下代码行中:
@Override
public T getLoggerClass() {
return loggerClass; <==== this line here
}
我收到以下语法错误:
Type mismatch: cannot convert from Class to T
为什么我会收到此消息?我可以采取什么措施来保留所需的 API 并纠正语法错误?有没有更好的方法来使用泛型最佳实践来编写此代码?
最佳答案
您声明您的类由某种类型参数化 T
,您说它可以是任何类,然后您希望该类成为 Class<?>
的子类型。这些是不兼容的。
要么你想要T
实际上是Class<?>
:
public interface Logger<T extends Class<?>> {
T getLoggerClass();
void setLoggerClass(T klass);
}
或者,您想要返回 T
的类。 而不是 T
本身。
public interface Logger<T> {
Class<? extends T> getLoggerClass();
void setLoggerClass(Class<T> klass);
}
关于java - 通用记录器接口(interface)引发语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20365987/