我已经定义了一个Java函数:
staticList createEmptyList() { return new ArrayList (); }
调用它的一种方法是这样的:
ListmyList = createEmptyList(); // Compiles
为什么我不能通过显式传递泛型类型参数来调用它?:
Object myObject = createEmtpyList(); // Doesn't compile. Why?
我Illegal start of expression
从编译器中得到错误.
当java编译器无法为静态方法自己推断参数类型时,您始终可以使用完全限定的方法名称传递它:Class.
Object list = Collections.emptyList();
如果将类型作为方法参数传入,则可以.
staticList createEmptyList( Class type ) { return new ArrayList (); } @Test public void createStringList() { List stringList = createEmptyList( String.class ); }
方法不能以与类型相同的方式进行泛化,因此具有动态类型泛型返回类型的方法的唯一选项 - phew是满口的:-) - 是将类型作为参数传递.
有关Java泛型的真正优秀常见问题,请参阅Angelika Langer的泛型常见问题解答.
.
.
跟进:
在这种情况下使用数组参数就没有意义了Collection.toArray( T[] )
.在那里使用数组的唯一原因是因为使用相同的(预分配的)数组来包含结果(如果数组足够大以使它们全部适合).这节省了在运行时始终分配新阵列的过程.
但是,出于教育目的,如果您确实想要使用数组类型,则语法非常相似:
staticList createEmptyList( T[] array ) { return new ArrayList (); } @Test public void testThing() { List integerList = createEmptyList( new Integer[ 1 ] ); }