如何强制使用静态泛型方法的返回类型?

时间:2015-06-24 10:47:36

标签: java generics java-7

有一个类层次结构:

String child = null;
Object parent = child;

如何在传递Set<Object>个参数时强制Sets.newHashSet(E...)返回String

4 个答案:

答案 0 :(得分:18)

您可以使用以下命令指定通用返回类型:

Sets.<Object>newHashSet(child);

也许您可以返回Set<? extends Object>,然后您可以将其写为返回类型:

public Set<? extends Object> myMethod() {
    return Sets.newHashSet(child);
}

答案 1 :(得分:7)

您将type参数显式传递给newHashSet

Sets.<Object>newHashSet(child);

如果类型参数未明确传递,则推断出类型,在这种情况下,它推断为错误的类型,大概是String

您似乎正在使用Guava's Sets。方法签名如下:

public static <E> HashSet<E> newHashSet()

正如您所看到的,newHashSet()采用了类型参数E。结果是HashSet<E>E被推断为String,但您已指定返回Set<Object>的方法。解决方案是帮助编译器或将返回类型中的限制放宽到Set<? extends Object>

答案 2 :(得分:3)

newHashSet将始终返回其泛型类型参数的类型。由于child的类型为String,编译器会将泛型类型推断为String,函数将返回HashSet<String>

您可以简单地通过Object传递child,而不是通过显式转换Object来强制编译器将Sets.newHashSet((Object) child); 推断为通用类型:

Sets.<Object>newHashSet(child);

或者你可以强制使用泛型类型,编译器现在可以看到强制转换:

/D=SPECIAL_H_HEADERGUARD

答案 3 :(得分:3)

在Java 8中,这个编译得很好;推理考虑了目标类型。

public Set<Object> myMethod() {
    return Sets.newHashSet(child);
}

使用JDK的API:

public Set<Object> myMethod() {
    return Collections.singleton(child); // Works too
}

在Java 5,6,7中,仅对参数类型进行了对此调用的推断。