Java 通用记录器接口引发语法错误

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

我正在尝试实现以下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();
但是在
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;
}