3

次のコード セグメントでは、コンパイラ エラーが発生します。

public List<Long> test()
{
    boolean b=true;
    return b ? Collections.emptyList() : Collections.emptyList();
}

互換性のないタイプが必要です:List<Long>見つかりました:List<Object>

次のようなジェネリック型が必要です。

public List<Long> test()
{
    boolean b=true;
    return b ? Collections.<Long>emptyList() : Collections.<Long>emptyList();
}

この三項演算子を次のように削除すると、

public List<Long> test()
{
    return Collections.emptyList();
}

if-elseまたは、次のような構造で表される場合、

public List<Long> test()
{
    boolean b=true;

    if(b)
    {
        return Collections.emptyList();
    }
    else
    {
        return Collections.emptyList();
    }        
}

その後、正常にコンパイルされます。

最初のケースがコンパイルされないのはなぜですか? jdk-7u11 でテスト済み。

4

2 に答える 2

4

Collections.emptyList()三項式の場合、コンパイラはメソッドの戻り値の型に基づいてメソッドの戻り値の型を推測する機会がありませんtest。代わりに、最初に (三項) 式の結果の型を解決する必要があります。そして、型が言及されていないため、メソッドList<Object>の戻り値の型と互換性がなくなりtestます。

しかし、return Collections.emptyList()では、使用可能な (正しい) コンテキスト (つまり、メソッドの戻り値の型) を使用して、戻り値の型がどうあるべきtestかを推測します。Collections.emptyList()

于 2013-06-03T04:11:23.953 に答える
1

つまり、三項式は戻り値の型からではなく、その 2 つの結果式から型パラメーターを推測します。この入れ子のため、3 項の全体的な結果を決定する前に、2 つの結果の型を決定する必要があります。

三項式の型はそのオペランドの型によって異なりますが、オペランドの 1 つ ( Collections.emptyList()) に未定義の型パラメーターがあります。その時点で、三項式にはまだ型がないため、型パラメーターに影響を与えることはできません。推論される型は 2 つあります。1 つは三項式の結果であり、もう 1 つはメソッドの型パラメーターです.emptyList()

おわかりのように、修正は、明示的に型を設定するようにコーディングCollections.<Long>emptyList()することにより、呼び出しのメソッド型を明示的に指定することです。これを使用して、三項式の型を決定し、次に戻り型に対してチェックします。

于 2013-06-03T04:42:08.680 に答える