1

次のコードはJDK6でコンパイルされます。JDK7でコンパイルエラーで失敗します。

java: incompatible types
  required: com.jdk7.IExporter<O>
  found:    com.jdk7.IExporter<java.lang.Object>

コンパイラは、Oracleの1.7.0_10です。

$ javac -version
javac 1.7.0_10

コード

package com.jdk7;

public class GenericIn7 {

    public <O> IExporter<O> getExporter(Class<O> objType) {
        final IExporter<O> localExporter = 
                determineExporter(getPersistentInterface(objType));
        return null;
    }

    private <O> IExporter<O> determineExporter(Class<O> persistentInterface) {
        return null;
    }

    protected <O, I extends O> Class<O> getPersistentInterface(Class<I> clazz) {

        return null;
    }
}

class IExporter<T> {
}

[完全を期すために、genericをIExporterに置き換えるなどの変更により、コンパイルされます。]

4

1 に答える 1

3

この行で期待どおりに型推論が機能していないようです。

final IExporter<O> localExporter = 
            determineExporter(getPersistentInterface(objType));

O問題はで解決されていることだと思いますgetPersistentInterface()。と呼んでいるかのように呼ばれていますthis.<Object, O>getPersistentInterface(...)。明示的な場合:

final IExporter<O> localExporter = 
            determineExporter(this.<O, O>getPersistentInterface(objType));

それはうまくいきます。

于 2013-01-22T05:09:44.457 に答える