我真的不明白你的问题。这是你要找的吗?
class MyClass {
protected static <T> Set<T> SetFactory(int size)
{
return new HashSet<T>(size);
}
protected static <K, V> Map<K, Set<V>> mapFactory(Collection<K> keys)
{
Map<K, Set<V>> result = new HashMap<K, Set<V>>(keys.size());
for (K key : keys)
result.put(key, MyClass.<V>SetFactory(20));
return result;
}
}
<V>
请注意泛型方法调用上的显式类型参数 ( )。
更新:
我可能错了,但是说没有演员表对我来说似乎是语义——不得不把 MyClass. 在前面似乎非常接近必须施放。你能解释一下区别吗?
强制转换为(Set<V>) SetFactory(20)
,它会生成关于类型安全的编译器警告,因为使用类型擦除无法检查SetFactory
函数结果的运行时类型是否为V
.
在方法调用上使用类型参数很像说new HashSet<V>()
. 调用泛型类的构造函数时,必须指定构造函数的类型参数。无论何时调用泛型方法,都必须指定类型参数。通常,这些可以从方法结果的分配或方法的参数中推断出来,但并非总是如此。
然而,这不是演员表。强制转换总是在运行时执行类型检查。像我在这里展示的那样指定泛型类型在编译时有效。