您正在尝试做的事情非常有用,我发现我需要在我编写的代码中经常这样做。一个示例用例:
假设我们有一个接口Foo,我们有一个zorking 包,它有一个ZorkingFooManager,它创建和管理包私有ZorkingFoo implements Foo 的实例。 (一个非常常见的场景。)
所以,ZorkingFooManager 需要包含一个private Collection<ZorkingFoo> zorkingFoos,但它需要公开一个public Collection<Foo> getAllFoos()。
大多数 Java 程序员在实现 getAllFoos() 之前不会三思而后行,因为它分配了一个新的 ArrayList<Foo>,用来自 zorkingFoos 的所有元素填充它并返回它。我很享受这样的想法,即在全球数百万台机器上运行的 java 代码所消耗的所有时钟周期中,大约 30% 的时钟周期除了创建这些无用的 ArrayList 副本之外什么也没做,这些副本在创建后的几微秒内就会被垃圾收集。
这个问题的解决方案当然是向下转换集合。这是最好的方法:
static <T,U extends T> List<T> downCastList( List<U> list )
{
return castList( list );
}
这将我们带到castList()函数:
static <T,E> List<T> castList( List<E> list )
{
@SuppressWarnings( "unchecked" )
List<T> result = (List<T>)list;
return result;
}
中间的result变量是必需的,因为java语言的变态:
因此,即使在 return 语句上使用 @SuppressWarnings 不符合规定,但在赋值上使用它显然是可以的,因此额外的“结果”变量解决了这个问题。 (无论如何,它都应该被编译器或 JIT 优化掉。)