我的代码存在严重问题;我正在使用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 代码的帖子根本不重要,但如果有帮助,请告诉我,我会发布。
谢谢!
答案 0 :(得分:1)
问题是您的方法需要ConfigurationListener<? super Configuration>
(任何类型为Configuration
的超级类型,或Configuration
本身),ConfigurationListener
需要T extends Configuration
(任何类型为Configuration
的子类型,或Configuration
本身的类型。唯一满足这两个条件的T
是Configuration
,但是Human implements ConfigurationListener<XMLConfiguration>
,因此不符合条件。