Java泛型值;SomeValue>;

Java泛型值;SomeValue>;,java,generics,Java,Generics,我进行了一次面试测试,看到了以下代码: 编辑: 公共类TestValue{ 私人价值; @试验 public void Empty_Value_有_无_值(){ Assert.assertFalse(Value.createEmptyValue() .hasValue()); } @试验 public void默认值为空(){ Assert.assertEquals(Value.createEmptyValue(), 默认值); } @试验 public void非\u空\u值\u有\u值(){

我进行了一次面试测试,看到了以下代码:

编辑:

公共类TestValue{
私人价值;
@试验
public void Empty_Value_有_无_值(){
Assert.assertFalse(Value.createEmptyValue()
.hasValue());
}
@试验
public void默认值为空(){
Assert.assertEquals(Value.createEmptyValue(),
默认值);
}
@试验
public void非\u空\u值\u有\u值(){
Assert.assertTrue(新值(true,new SomeValue())
.hasValue());
}
}
我从未见过像这样的Java泛型

Value.<SomeValue>
值。
测试是用上面给定的单元测试代码实现Value类

我试图找出下面的值方法签名(需要实现):

公共接口值{
公共布尔值();
公共值createEmptyValue();
}
有人知道吗,请帮忙

多谢各位

编辑:根据下面@marlon的答案,应该是这样

public class Value<T> {

    public boolean hasValue(){}
    public static <M> Value<M> createEmptyValue(){}; //need <M>
}
公共类值{
公共布尔值(){}
公共静态值createEmptyValue(){};//需要
}
需要了解的关键语法:

Value.<SomeValue>  //ClassName.<Type>method
值//ClassName.method
是使用参数化参数调用类的静态方法的方法

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

SomeObject.<Type>method
SomeObject.method
值。
这是泛型表示方法的方式

以谷歌番石榴的
可选
为例:

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

由于接口不能声明静态方法(java真丢脸),所以只需将方法声明为静态方法,而忽略接口,如下所示:

class Value<T> {

    public static <T> Value<T> createEmptyValue(){
        return null;
    }
}
类值{
公共静态值createEmptyValue(){
返回null;
}
}
1)这是调用泛型方法的方式。参考>>

2)
值中。
可选的。编译器可以推断类型。这称为类型推断。参考>>

答案更新:


3)
值。createEmptyValue()
是正确的,
Value.createEmptyValue()
也是正确的。这两种方式都是合法的。刚刚测试过。以前没有注意到。

使用下面的
getEmptyList
方法查看类
Test

public class Test {
    public <T> List<T> getEmptyList() {
        return new ArrayList<T>();
    }
}
然后,类型推断机制能够根据变量类型推断类型参数

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

printList(t.getEmptyList()); // This will FAIL.
但是,如果需要在方法调用表达式中使用
getEmptyList
的返回值,如以下示例中的方法
printList
需要类型为
List
的单个参数,则无法从任何变量类型推断该类型

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

printList(t.getEmptyList()); // This will FAIL.
公共作废打印列表(列表){
用于(int i:列表){
系统输出打印(一);
}
}
打印列表(t.getEmptyList());//这将失败。
在这种情况下,需要使用以下命令指定类型:

printList(t.<Integer>getEmptyList());
printList(t.getEmptyList());

尽管
Value
本身显然是类型化的(基于
Value
的实例变量类型),静态
createEmptyValue()
方法也是类型化的

如果遵循命名约定,一个合理的假设是
SomeValue
扩展(或实现)
Value

虽然没有一个正确的答案,但是
值签名的可能性是:

public class Value<T extend Value> {
    public static <V extends Value> V createEmptyValue() {
        // some impl
    }
}
公共类值{
公共静态V createEmptyValue(){
//一些简单的
}
}

可能是打字错误<代码>值。createEmptyValue()
更有意义。这是白板编码吗?也许它只是对一个类型的引用,根据定义它可以是任何类型,只是意味着它们提供了该类型的值,但是类型并不重要?这就是我在这种情况下的假设;我自己也有点好奇。我做了一些研究,实际上有些情况下你需要使用
SomeObject.method
-语法而不需要静态的方法。请参阅我的答案以获得解释。
.method
语法与静态方法或具有类型参数的类型无关。仅当方法具有类型参数(无法推断)时才适用!您的意思是上面的createEmptyValue()应该是静态的吗?与公共静态值createEmptyValue()类似//编译错误:无法对非静态类型进行静态引用T@Eric:差不多,但是您需要在
上参数化静态方法,比如
公共静态值createEmptyValue(){…}
。正如编译器所指出的,您不能从静态方法引用类上的非静态参数t。@Eric,Ryan Stewart更新了我的答案以反映您的评论。静态与此无关,尽管在本例中它似乎是一个静态方法。实例和静态方法都可能是类型化的,因为当前编写的方法,第(3)部分给出的两个示例之间的唯一区别是空格;你能详细说明一下假设的区别吗?啊,刚刚测试过。它确实有效。该死,我以前没注意到。
printList(t.<Integer>getEmptyList());
public class Value<T extend Value> {
    public static <V extends Value> V createEmptyValue() {
        // some impl
    }
}