通用记录器界面引发语法错误

问题描述 投票:0回答:2

我正在尝试实现以下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并纠正语法错误?有没有更好的方法可以使用泛型最佳实践来编写此代码?

java generics interface syntax-error
2个回答
2
投票

您正在声明您的类是由某种类型的T参数化的,您可以说它可以是任何类,然后您希望该类成为Class<?>的子类型。这些不兼容。


0
投票

由于Class不是T,所以这里出现类型不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.