如何强制静态泛型方法的 return 类型?
How do I force a static generic method's return type?
具有 class 层次结构:
String child = null;
Object parent = child;
如何在传递 String
参数时强制 Sets.newHashSet(E...)
到 return 一个 Set<Object>
?
您将类型参数显式传递给 newHashSet
:
Sets.<Object>newHashSet(child);
如果未显式传递类型参数,则会推断类型,在这种情况下,它会被推断为错误的类型,大概是 String
.
您似乎在使用 Guava's Sets。方法签名如下:
public static <E> HashSet<E> newHashSet()
如您所见,newHashSet()
采用类型参数 E
。结果是HashSet<E>
。 E
被推断为 String
,但您已将方法指定为 return Set<Object>
。解决方案是帮助编译器或将 return 类型中的限制放宽为 Set<? extends Object>
.
您可以指定通用 return 类型:
Sets.<Object>newHashSet(child);
也许你returnSet<? extends Object>
就可以了,那么你可以把它写成return类型:
public Set<? extends Object> myMethod() {
return Sets.newHashSet(child);
}
newHashSet
将始终 return 其泛型类型参数的类型。由于 child
的类型是 String
编译器将推断泛型类型为 String
并且函数将 return a HashSet<String>
.
您可以通过显式强制转换 child
来简单地将 Object
传递给它,以强制编译器将 Object
推断为通用类型:
Sets.newHashSet((Object) child);
或者,您可以强制使用通用类型,编译器现在可以看到转换是微不足道的:
Sets.<Object>newHashSet(child);
在Java8中,这个编译就好了;推理考虑了目标类型。
public Set<Object> myMethod() {
return Sets.newHashSet(child);
}
使用 JDK 的 API:
public Set<Object> myMethod() {
return Collections.singleton(child); // Works too
}
在 Java 5、6、7 中,此调用的推断仅根据参数类型完成。
具有 class 层次结构:
String child = null;
Object parent = child;
如何在传递 String
参数时强制 Sets.newHashSet(E...)
到 return 一个 Set<Object>
?
您将类型参数显式传递给 newHashSet
:
Sets.<Object>newHashSet(child);
如果未显式传递类型参数,则会推断类型,在这种情况下,它会被推断为错误的类型,大概是 String
.
您似乎在使用 Guava's Sets。方法签名如下:
public static <E> HashSet<E> newHashSet()
如您所见,newHashSet()
采用类型参数 E
。结果是HashSet<E>
。 E
被推断为 String
,但您已将方法指定为 return Set<Object>
。解决方案是帮助编译器或将 return 类型中的限制放宽为 Set<? extends Object>
.
您可以指定通用 return 类型:
Sets.<Object>newHashSet(child);
也许你returnSet<? extends Object>
就可以了,那么你可以把它写成return类型:
public Set<? extends Object> myMethod() {
return Sets.newHashSet(child);
}
newHashSet
将始终 return 其泛型类型参数的类型。由于 child
的类型是 String
编译器将推断泛型类型为 String
并且函数将 return a HashSet<String>
.
您可以通过显式强制转换 child
来简单地将 Object
传递给它,以强制编译器将 Object
推断为通用类型:
Sets.newHashSet((Object) child);
或者,您可以强制使用通用类型,编译器现在可以看到转换是微不足道的:
Sets.<Object>newHashSet(child);
在Java8中,这个编译就好了;推理考虑了目标类型。
public Set<Object> myMethod() {
return Sets.newHashSet(child);
}
使用 JDK 的 API:
public Set<Object> myMethod() {
return Collections.singleton(child); // Works too
}
在 Java 5、6、7 中,此调用的推断仅根据参数类型完成。