当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能将类型参数显式传递给通用Java方法?

如何解决《为什么我不能将类型参数显式传递给通用Java方法?》经验,为你挑选了2个好方法。

我已经定义了一个Java函数:

static  List createEmptyList() {
    return new ArrayList();
}

调用它的一种方法是这样的:

List myList = createEmptyList(); // Compiles

为什么我不能通过显式传递泛型类型参数来调用它?:

Object myObject = createEmtpyList(); // Doesn't compile. Why?

Illegal start of expression从编译器中得到错误.



1> 小智..:

当java编译器无法为静态方法自己推断参数类型时,您始终可以使用完全限定的方法名称传递它:Class. method();

Object list = Collections. emptyList();


对于非静态方法,可以使用this关键字:`Object list = this. emptyList();`

2> Cheekysoft..:

如果将类型作为方法参数传入,则可以.

static  List createEmptyList( Class type ) {
  return new ArrayList();
}

@Test
public void createStringList() {
  List stringList = createEmptyList( String.class );
}

方法不能以与类型相同的方式进行泛化,因此具有动态类型泛型返回类型的方法的唯一选项 - phew是满口的:-) - 是将类型作为参数传递.

有关Java泛型的真正优秀常见问题,请参阅Angelika Langer的泛型常见问题解答.

.
.

跟进:

在这种情况下使用数组参数就没有意义了Collection.toArray( T[] ).在那里使用数组的唯一原因是因为使用相同的(预分配的)数组来包含结果(如果数组足够大以使它们全部适合).这节省了在运行时始终分配新阵列的过程.

但是,出于教育目的,如果您确实想要使用数组类型,则语法非常相似:

static  List createEmptyList( T[] array ) {
  return new ArrayList();
}

@Test
public void testThing() {
  List integerList = createEmptyList( new Integer[ 1 ] );
}

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有