我的 java 应用程序中有一个非常奇怪的问题。我正在用 maven 构建它并在 Eclipse IDE 中开发它。这可能是一个有点冗长的解释,但请坚持到最后,因为问题真的很奇怪,我不知道可能是什么原因。
这是我正在编写的代码示例:
假设我们有一个“处理程序”接口。它可以处理特定的对象类型:
public interface Handler<T> {
public void handle(T obj);
}
现在假设我们想要处理程序链接。我们可以这样做:
public class HandlerChain<T> implements Handler<T> {
private Handler<? super T> h;
@Override
public void handle(T obj) {
//h can handle T objects
h.handle(obj);
}
private HandlerChain(Handler<? super T> h) {
super();
this.h = h;
}
//syntax sugar to start the chain
public static <T> HandlerChain<T> start(Handler<? super T> h){
return new HandlerChain<T>(h);
}
//add another handler to the chain
public HandlerChain<T> next(final Handler<? super T> handler){
return new HandlerChain<T>(new Handler<T>() {
@Override
public void handle(T obj) {
h.handle(obj);
handler.handle(obj);
}
});
}
}
现在让我们为字符串处理程序创建一些处理程序工厂:
public class Handlers {
public static Handler<String> h1(){
return new Handler<String>(){
@Override
public void handle(String obj) {
// do something
}
};
}
public static Handler<String> h2(){
return new Handler<String>(){
@Override
public void handle(String obj) {
// do something
}
};
}
}
所以最后我们创建了一个类,使用链中的两个处理程序来处理一些字符串:
public class Test {
public void doHandle(String obj){
HandlerChain.start(Handlers.h1()).next(Handlers.h2()).handle(obj);
}
}
所以,对我来说,这段代码似乎没有错。Eclipse IDE 也不介意。它甚至正确地运行它。但是,当我尝试使用 cli 中的 maven 编译此代码时,出现错误:
Test.java:[7,50] next(Handler<? super java.lang.Object>) in HandlerChain<java.lang.Object> cannot be applied to (Handler<java.lang.String>)
有没有人偶然发现类似的问题?我真的很想知道这种语法在java中是否有效,或者这是由于设置错误或其他原因导致的一些奇怪的编译器错误?要重复 Eclipse 编译并正确运行此代码,但 maven cli 无法编译它。
最后,这是我在 pom.xml 中的 maven-compiler-plugin 设置。它可能与整个问题有关。
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<executions>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</execution>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
提前致谢!