0

私は次のコードを持っています:

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

そして、次のメソッド署名(Eclipseツールチップから(実際のコードではありません)):

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

何らかの理由で、戻り値の型が Object として解決されます。Eclipse はこの行をエラーとしてマークしないため、これは奇妙ですが、Ant および Maven ビルダーはこの行でオブジェクトを 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()の a を返しますClass。つまり、実際には aであり、それがaClass<? extends Object>であると推測する方法はありません。? extends ObjectSomeInterface

たとえば、次のsomeClassようになります。

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

問題はこの行です:

public Class someClass() {

Classこれはraw型オブジェクトを返します。これは実質的に。と同等Class<? extends Object>です。このメソッドも汎用にする必要があります。

public Class<? extends T> someClass() {

そしてそれを次のように呼びます:

resolver.<SomeInterface>someClass();

理想的には、の署名に実際のタイプを入力して、getInvokedBusinessInterface()を返すようにしますClass<? extends SomeInterface>

于 2013-01-27T23:24:58.417 に答える