我正在尝试实现以下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
}
我收到以下语法错误:
类型不匹配:无法从类转换为T
为什么会收到这个消息,我该怎么做才能保留所需的API并纠正语法错误?有没有更好的方法可以使用泛型最佳实践来编写此代码?
您正在声明您的类是由某种类型的T
参数化的,您可以说它可以是任何类,然后您希望该类成为Class<?>
的子类型。这些不兼容。
由于Class
不是T
,所以这里出现类型不匹配。