java - 通用记录器接口(interface)引发语法错误

标签 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
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/

相关文章:

java - 如何从对象列表中选择一个对象

java - 将我的 Android 应用程序导出到 iPhone?

通用堆栈数组的 JAVA 通配符捕获错误

java - 三合会不出现战斗? (Java Set 缺少一项)

java - Java Class.forName 的问题

java - android 新手 - <integer> 语法令人困惑

java - 如何通过两个 return 语句进行递归? [JAVA]

generics - 如何调用像 std::num::Float::epsilon() 这样的静态特征方法?

java - 在Java中,我可以继承由类型参数提供的类吗?

java - 可以使用接口(interface)来实现抽象吗