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

是使用参数化参数调用类的静态方法的方法。

编辑:根据@snipes83,使用参数化参数调用类的非静态方法的语法。

SomeObject.<Type>method
4

4 回答 4

6

Value.<SomeValue>这是泛型代表方法的方式。

以 Google GuavaOptional为例:

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 回答
3

Test使用以下方法查看类getEmptyList

public class Test {
    public <T> List<T> getEmptyList() {
        return new ArrayList<T>();
    }
}

它返回一个空List的包含类型的对象T

如果你Test这样使用

Test t = new Test();
List<Integer> list = t.getEmptyList();

然后类型推断机制能够根据变量类型推断类型参数。

但是,如果您需要getEmptyList在方法调用表达式中使用返回值,如下例所示,其中该方法printList需要一个 type 参数List<Integer>,则无法从任何变量类型推断出该类型。

public void printList(List<Integer> list) {
    for (int i : list) {
        System.out.print(i);
    }
}

printList(t.getEmptyList()); // This will FAIL.

在这种情况下,您需要使用以下内容指定类型:

printList(t.<Integer>getEmptyList());
于 2013-06-05T02:41:55.410 回答
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 回答