我有以下内容:
public class RandomList {
private List<Integer> list;
public List<Integer> getList() {
return list;
}
public RandomList (int n) {
list = new ArrayList<Integer>();
Random rand = new Random();
rand.setSeed(System.currentTimeMillis());
for (int i=0; i < n; i++)
{
Integer r = rand.nextInt();
list.add(r);
}
}
}
给了我一个填充随机整数值的列表。我想概括一下,也可以得到一个随机字符值列表或者其他类型的列表&#39;随机值。
所以我想要的是通用类型版本class RandomList<T>
。我可以随处更换&#34; Integer&#34;通过&#34; T&#34;,但我被困在Integer r = rand.nextInt();
行,不同类型的读者会不同。
我正在考虑做以下事情:
instanceof
检查传入的类中所需的类型(整数,字符...),并根据检查返回正确的随机值这有意义吗?是否有其他/更好的方法来实现我想要的目标?
答案 0 :(得分:7)
在Java中,您无法检查泛型类型,至少在没有反射的情况下。你使用泛型类型的钱,所以你会做这样的事情:
public class RandomList<T> {
private List<T> list;
private Class<T> clazz;
public List<T> getList() {
return list;
}
public RandomList (Class<T> clazz, int n) {
this.clazz = clazz;
list = new ArrayList<T>();
Random rand = new Random();
rand.setSeed(System.currentTimeMillis());
if (clazz.isAssignableFrom(Integer.class)) {
for (int i = 0; i < n; i++) {
Integer r = rand.nextInt();
list.add(r);
}
}
else {
throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
}
}
}
或者,您可以进一步概括这一点并添加Function
以生成随机化结果。请注意,这需要Java 8.如果您不使用Java 8,则可以定义一个接口并匿名构建。
public class RandomList<T> {
private List<T> list;
public List<T> getList() {
return list;
}
public RandomList (Function<Random, T> creator, int n) {
list = new ArrayList<T>();
Random rand = new Random();
rand.setSeed(System.currentTimeMillis());
for (int i = 0; i < n; i++) {
list.add(creator.apply(rand));
}
}
}
使用以下方法构建新实例:
RandomList<Integer> list = new RandomList<>(rand -> rand.nextInt(), 10);
编辑:以后发生这种情况,但您似乎使用的是Java 8,因此您可以使用流:
List<Integer> list = Stream.generate(() -> rand.nextInt()).limit(10).collect(Collectors.toList())