Java アプリケーションで非常に奇妙な問題が発生しています。私はmavenで構築し、Eclipse IDEで開発しています。これは少し長い説明になるかもしれませんが、最後まで固執してください。なぜなら、問題は本当に奇妙で、何が原因なのか見当がつかないからです。
これが私が書いているコードの例です:
「ハンドラー」インターフェースがあるとします。特定のオブジェクト タイプを処理できます。
public interface Handler<T> {
public void handle(T obj);
}
ここで、Handler チェーンが必要だとしましょう。次のようにできます。
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
}
};
}
}
最後に、チェーン内の 2 つのハンドラーを使用して、いくつかの文字列を処理するクラスを作成します。
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>
前もって感謝します!