使用Java泛型,接口和继承不兼容

时间:2013-07-03 23:06:13

标签: java generics inheritance interface

我的代码存在严重问题;我正在使用Generics,Interfaces和实现这些接口的类;总结一下:

ConfigurationListener.java

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

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给出了以下错误:

  

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

t3b.Human 使用配置的子项实现 ConfigurationListener !!这就是我不明白的地方。

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是您的方法需要ConfigurationListener<? super Configuration>(任何类型为Configuration的超级类型,或Configuration本身),ConfigurationListener需要T extends Configuration (任何类型为Configuration的子类型,或Configuration本身的类型。唯一满足这两个条件的TConfiguration,但是Human implements ConfigurationListener<XMLConfiguration>,因此不符合条件。