8

面接試験を受けたところ、次のコードが表示されました。

編集:

public class TestValue {
    private Value<SomeValue> defaultValue;

    @Test
    public void Empty_Value_Has_No_Value() {
        Assert.assertFalse(Value.<SomeValue> createEmptyValue()
            .hasValue());
    }

    @Test
    public void Default_Value_IsEmpty() {
        Assert.assertEquals(Value.<SomeValue> createEmptyValue(),
            defaultValue);
    }

    @Test
    public void Non_Empty_Value_Has_Value() {
        Assert.assertTrue(new Value<SomeValue>(true, new SomeValue())
            .hasValue());
    }
}

Javaジェネリックのようなものを見たことがありませんでした

Value.<SomeValue>

テストは、上記の単体テスト コードを使用して Value クラスを実装することです。

以下の Value メソッドのシグネチャを理解しようとしました (実装が必要です)。

public interface Value<T> {

    public boolean hasValue();
    public Value<T> createEmptyValue();
}

誰でも知っていますか、助けてください。

ありがとうございました

編集:@marlon以下の回答によると、このようにする必要があります

public class Value<T> {

    public boolean hasValue(){}
    public static <M> Value<M> createEmptyValue(){}; //need <M>
}

知っておくべき重要な構文:

Value.<SomeValue>  //ClassName.<Type>method

パラメータ化された引数を持つクラスの静的メソッドを呼び出す方法です。

EDIT:@ snipes83によると、パラメータ化された引数を持つクラスの非静的メソッドを呼び出す構文。

SomeObject.<Type>method
4

4 に答える 4

6

Value.<SomeValue>これは、ジェネリックがメソッドに対して表現される方法です。

Optional例としてGoogle Guava を使用します。

Optional<String> email = Optional.<String>of(strEmail);

ジェネリック型 - ジェネリック メソッドの呼び出しを参照してください。

インターフェイスは静的メソッドを宣言できないため (Java の恥)、次のようにメソッドを静的として宣言し、インターフェイスを忘れてください。

class Value<T> {

    public static <T> Value<T> createEmptyValue(){
        return null;
    }
}
于 2013-06-05T01:46:16.527 に答える
2

1)これがジェネリックメソッドの呼び出し方法です。参照 >> http://docs.oracle.com/javase/tutorial/java/generics/methods.html

2) <SomeValue> inValue.<SomeValue>オプションです。コンパイラは型を推測できます。これはTypeInferenceと呼ばれます。参照 >> http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

回答が更新されました:

3) Value.<SomeValue> createEmptyValue()正しく、Value.<SomeValue>createEmptyValue()あまりにも正しい。どちらの方法も合法です。ちょうどそれをテストしました。以前は気づきませんでした。

于 2013-06-05T02:16:36.323 に答える
1

自体Valueは明らかに型付けされていますが ( のインスタンス変数の型に基づいてValue<SomeValue>)、静的createEmptyValue()メソッドも型付けされています。

命名規則が順守されている場合、合理的な仮定は、SomeValue拡張 (または実装)Valueです。

正解はありませんが、署名の可能性Valueは次のとおりです。

public class Value<T extend Value> {
    public static <V extends Value> V createEmptyValue() {
        // some impl
    }
}
于 2013-06-05T06:03:04.993 に答える