我想编写一个通用方法,它采用一个包含整数或字符串值的集合。该方法应该对给定的 Set 进行分区并返回一个包含泛型集合的列表。我对泛型很陌生,并且对下面指定的代码有疑问。编译器不喜欢方法签名中的 T 。问题是什么?
private List<Set<T>> createChunkSet(Set<T> set) {
Set<T> set = new HashSet<T>();
return set;
}
更改方法声明:
private <T> List<Set<T>> createChunkSet(Set<T> set) {
// your code here
}
它得到一个包含整数或字符串值的 Set
ASet<T>
只能具有一种类型的元素,即 的类型T
,因此,要么Integer
或String
,而不是两者。
您必须返回一个列表,因为现在您要返回一个列表。
将其更改为:
private List<Set<T>> createChunkSet(Set<T> set) {
set = new HashSet<T>();
List<Set<T>> list = new ArrayList<Set<T>>();
list.add(set);
return list;
}
我想编写一个通用方法,它获取一个包含整数或字符串值的集合。该方法应该对给定的 Set 进行分区并返回一个包含泛型集合的列表。
好的,这个方法的参数应该是 java.util.Set。Object 是 String 和 Integer 的通用超类。
但是返回类型呢?
您要求返回的列表应包含 2 个 Set,Set 和 Set。这不能使用泛型(而不是任何其他语言)在 Java 中类型安全地编写 - 类型安全列表是所有相同类型的对象的列表!
您想要达到的目标可以按如下方式完成:
public <T> Set<T> createChunkSet(Set<Object> set, Class<T> filterClass) {
Set<T> chunkedSet = new HashSet<T>();
for (Object o : set) {
if (filterClass.isAssignableFrom(o.getClass())) {
chunkedSet.add(filterClass.cast(o));
}
}
return chunkedSet;
}
必须像这样调用此方法:
Set<Integer> ints = createChunkSet(myUntypesSet, Integer.class);