0

我的代码存在严重问题;我正在使用实现此类接口的泛型、接口和类;总结一下:

配置监听器.java

public interface ConfigurationListener<T extends Configuration> {
    public void configurationChange(ConfigurationProperty<?> [] changes, T configuration);
}

配置.java

public class Configuration {
    ...
    protected HashSet<ConfigurationListener<? super Configuration>> listeners;
    ...
    public void applyTo(ConfigurationListener<? super Configuration> listener) {
        if (listeners.add(listener)) {
            ...
        }
    }
    ...
}

XMLConfiguration.java

public class XMLConfiguration extends Configuration {
    ...
    @Override
    public void applyTo(ConfigurationListener<? super Configuration> listener) {
        tryLoad(); // Try to load the content of the XML file
        super.applyTo(listener);
    }
    ...
}

我在测试的时候发现如下问题,实在不明白为什么:

t3b.java

public class t3b {
    public static class Human implements ConfigurationListener<XMLConfiguration> {
        @Override
        public void configurationChange(ConfigurationProperty<?>[] changes, XMLConfiguration configuration) {
            ...
        }
    }
    public static void main(String [] args) {
        XMLConfiguration conf = new XMLConfiguration("xmlconf.xml", "sectn", new ConfigurationProperty<?> [] {
            new ConfigurationProperty<Integer>("age", 23),
            new ConfigurationProperty<String>("name", "Juan")
        });
        conf.applyTo(new Human());
    }
}

线

conf.applyTo(new Human());

打破这一切;Eclipse SDK 给了我以下错误:

XMLConfiguration 类型中的方法 applyTo(ConfigurationListener) 不适用于参数 (t3b.Human)

但是t3b.Human使用Configuration的子级来实现ConfigurationListener!这就是我不明白的。

我知道我的代码逻辑可能更简单,但我想知道它为什么会失败。

我认为发布ConfigurationProperty.java的代码根本不重要,但如果有帮助,请告诉我,我会发布它。

谢谢!

4

1 回答 1

1

问题是您的方法需要ConfigurationListener<? super Configuration>(任何类型的超类型ConfigurationConfiguration自身)和ConfigurationListener需要T extends Configuration(任何类型的子类型ConfigurationConfiguration自身)。唯一T同时满足这两个条件的是Configuration, 但是Human implements ConfigurationListener<XMLConfiguration>,所以它是不合格的。

于 2013-07-03T23:57:12.193 回答