繁体   English   中英

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

[英]How do I force a static generic method's return type?

有一个类层次结构:

String child = null;
Object parent = child;

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

您可以指定泛型返回类型:

Sets.<Object>newHashSet(child);

也许你可以返回Set<? extends Object> Set<? extends Object> ,然后你可以把它写成一个返回类型:

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

您将type参数显式传递给newHashSet

Sets.<Object>newHashSet(child);

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

看来你正在使用Guava的套装 方法签名如下:

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

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

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

你可以简单地传递一个Object的,而不是铸造child明确强制编译器来推断Object作为泛型类型来代替:

Sets.newHashSet((Object) child);

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

Sets.<Object>newHashSet(child);

在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中,仅对参数类型进行了对此调用的推断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM