0

我有以下代码:

SomeInterface self = sessionContext.getBusinessObject(sessionContext.getInvokedBusinessInterface());

并遵循方法签名(来自 eclipse 工具提示(不是真实代码)):

<Object> Object javax.ejb.SessionContext.getBusinessObject(Class<Object> arg0) throws IllegalStateException

由于某种原因,返回类型被解析为对象。这很奇怪,因为 eclipse 没有将此行标记为错误,但是 ant 和 maven 构建器在此行上失败了,说 Object 不能转换为 SomeInterface。

我有几个问题:

  • 我的代码有什么问题,所以类型推断不正确(实际上它不应该是 Object,因为变量类型是SomeInterface)?
  • 为什么在 Eclipse(错误)中没有将行标记为错误?

我有以下示例,该示例在 Eclipse 下正确编译,但在 Maven 中失败:

public class TestClass implements SomeInterface {
    private Resolver resolver;

    /**
     * 
     */
    @SuppressWarnings("unchecked")
    public TestClass() {
        SomeInterface c = resolver.some(resolver.someClass());
    }

    @Override
    public void something() {
    }
}

class Resolver {
    public <T> T some(final Class<T> c) {
        return null;
    }

    public Class someClass() {
        return null;
    }
}

interface SomeInterface {
    void something();
}

这里的类型是正确推断的(来自 eclipse 工具提示(不是真正的代码)):

 <SomeInterface> SomeInterface Resolver.some(Class<SomeInterface> c)

但是这个类仍然不能用maven编译器编译。

我正在使用日食朱诺。

UPD

Maven失败:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project jpharm-server: Compilation failure
[ERROR] TestClass.java:[21,39] incompatible types
[ERROR] found   : java.lang.Object
[ERROR] required: SomeInterface
4

2 回答 2

4

你可以写:

SomeInterface c = resolver.<SomeInterface> some(resolver.someClass());

帮助编译器。

您给出的具体示例不应该编译。编译器在应用类型推断时,会尝试找到适合语句所有操作数的最具体的类型。在这里,resolver.someClass()返回 aClass可以是任何类,即它确实是 aClass<? extends Object>并且没有办法推断它? extends Object是 a SomeInterface

例如,someClass很可能是:

public Class someClass() {
    return Object.class;
}
于 2013-01-27T23:11:46.403 回答
1

问题是这一行:

public Class someClass() {

这将返回一个原始类型Class对象,它实际上Class<? extends Object>. 您也应该使此方法通用:

public Class<? extends T> someClass() {

并调用它:

resolver.<SomeInterface>someClass();

理想情况下,您会在您的签名中填写一个实际类型,getInvokedBusinessInterface()以便它返回一个Class<? extends SomeInterface>.

于 2013-01-27T23:24:58.417 回答