提问人:fredoverflow 提问时间:3/14/2011 更新时间:6/18/2015 访问量:88340
调用静态泛型方法
Calling static generic methods
问:
我遇到了一个涉及静态泛型方法的奇怪情况。这是代码:
class Foo<E>
{
public static <E> Foo<E> createFoo()
{
// ...
}
}
class Bar<E>
{
private Foo<E> member;
public Bar()
{
member = Foo.createFoo();
}
}
为什么我不必在表达式中指定任何类型参数?这是某种类型推断吗?如果我想明确说明它,我该如何指定类型参数?Foo.createFoo()
答:
218赞
Jon Skeet
3/14/2011
#1
是的,这是根据 JLS 第 15.12.2.8 节基于赋值目标的类型推断。为了明确起见,您可以这样称呼:
Foo.<String>createFoo();
评论
3赞
fredoverflow
3/14/2011
或者,就像我的情况一样:谢谢你:)Foo.<E>createFoo();
7赞
fredoverflow
3/14/2011
为什么没有分配也能工作?也就是说,该语句编译得很好......?这是由于类型擦除造成的吗?Foo.createFoo();
12赞
irreputable
3/15/2011
没有赋值的@FredOverflow被“推断”为E
Object
3赞
Joanis
11/28/2014
新的链接位置可能是:docs.oracle.com/javase/specs/jls/se8/html/...
3赞
Gavin S. Yancey
4/16/2015
指定 type 的另一种方法是定义 获取 type 的参数(所以它是 ),然后用E
createFoo()
Class<E>
createFoo(Class<E> type)
createFoo(String.class)
评论