0

我的 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> 

提前致谢!

4

1 回答 1

1

有没有人偶然发现类似的问题?

是的,并且在使用泛型类型进行奇怪和不寻常(可能不正确)的事情时也是如此。

问题是 Eclipse 编译器没有报告那些奇怪的结构的编译错误,而javacSun JDK 的标准抱怨类型擦除。(它与 JDK 1.6 一起使用)。(如果我没记错的话:eclipse report a only a warning)

我的解决方案是设置 maven 以使用 eclipse 编译器。另一个(更好的)选项是修复代码,但由于这是一项非常复杂的任务,而且我在运行时没有任何问题,所以我选择了“快速而肮脏”的第一个选项。

以下是如何设置编译器:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
            <source>${compiler.source}</source>
            <target>${compiler.target}</target>
            <encoding>${source.encoding}</encoding>
            <fork>false</fork>
            <compilerId>jdt</compilerId>
    </configuration>
    <dependencies>
            <dependency>
                    <groupId>org.eclipse.tycho</groupId>
                    <artifactId>tycho-compiler-jdt</artifactId>
                    <version>0.13.0</version>
            </dependency>
    </dependencies>
</plugin>
于 2013-04-05T09:48:41.123 回答