Java 通用记录器接口引发语法错误
我正在尝试实现以下API:Java 通用记录器接口引发语法错误,java,generics,interface,syntax-error,Java,Generics,Interface,Syntax Error,我正在尝试实现以下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 c
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();
但是在SimpleLogger
中,在以下代码行上:
@Override
public T getLoggerClass() {
return loggerClass; <==== this line here
}
@覆盖
公共T getLoggerClass(){
return loggerClass;您声明您的类由某个类型T
参数化,您说该类型可以是任何类,然后您希望该类成为class
的子类型。这些类型是不兼容的
或者您希望T
实际成为类
:
这里的类型不匹配是因为Class
不是T
如果您确实需要在getLoggerClass()
中返回T
,有一种方法:
将您的日志类声明为:
private Class<T> loggerClass;
然后编写一个构造函数:
public SimpleLogger(T t)
{
super() // You know the constructors of Logger...
this.t = t;
}
因此,很容易:
@Override
public T getLoggerClass() {
return t;
}
谢谢@Daniel Pryden(+1)-这已经开始有意义了。但我想我仍然不确定我想要这两个选项中的哪一个。你能看看我在问题开始时想要的API,帮我解释一下我想要这两个选项中的哪一个吗?基本上,如果我声明一个SimpleLogger
,然后调用记录器的getLoggerClass
方法,对于任何其他类,我需要Widget.class
。等等。再次感谢!对于第一个选项,您必须声明SimpleLogger
,但是参数的类型将与您从getLoggerClass()
返回的类型匹配(它们都是T
)。听起来您想要第二个选项:您想要参数中的一种类型(Widget
)和由getLoggerClass()
(Class
)返回的另一种类型(Class
),因为您希望能够将其分配给类型为Class
)的变量。再次感谢@Daniel Pryden(再次+1)-既然你这么解释了,听起来好像我想要选项2。但是,我该如何声明SimpleLogger
?是公共类SimpleLogger实现Logger
,还是公共类SimpleLogger实现Logger
,还是其他什么?保证这是最后一个问题!再次感谢大家的提问他帮助!@TicketMonster:如果你想参数化SimpleLogger
,那么它应该声明为class SimpleLogger implements Logger
。或者,你可以声明类似class SimpleWidgetLogger implements Logger
的东西,但它不再是参数化类型。
public interface Logger<T> {
Class<? extends T> getLoggerClass();
void setLoggerClass(Class<T> klass);
}
private Class<T> loggerClass;
private T t;`
public SimpleLogger(T t)
{
super() // You know the constructors of Logger...
this.t = t;
}
@Override
public T getLoggerClass() {
return t;
}