15.11.1 小节 任何基本類型都不能作爲類型參數 的例子
import net.mindview.util.*;
// Fill an array using a generator:
class FArray {
public static <T> T[] fill(T[] a, Generator<T> gen) {
for(int i = 0; i < a.length; i++)
a[i] = gen.next();
return a;
}
}
public class PrimitiveGenericTest {
public static void main(String[] args) {
//书上没说这句会报错,但编译报错
String[] strings = FArray.fill(new String[7], new RandomGenerator.String(10));
for(String s : strings)
System.out.println(s);
//书上没说这句会报错,但编译报错
Integer[] integers = FArray.fill(new Integer[7], new RandomGenerator.Integer());
for(int i: integers)
System.out.println(i);
// Autoboxing won't save you here. This won't compile:这句确实会报错
int[] b = FArray.fill(new int[7], new RandomGenerator.Integer());
}
} /* Output:
这个例子很简单,只是想告诉我们,自动拆装箱,只能用在非数组的变量上。这里还得导入作者的 jar 包,很讨厌。(我想这里,作者是指,泛型方法的返回值,如果返回的 Integer[],不能拆箱为 int[])。顺着看这些作者写的类的源码,如下:
public class RandomGenerator {
//省略
public static class String extends net.mindview.util.CountingGenerator.String {
public String() {
this.cg = new RandomGenerator.Character();
}
public String(int length) {
super(length);
this.cg = new RandomGenerator.Character();
}
}
}
好了,这是一个静态内部类。但这个静态内部类还继承了别人,再去看:
public class CountingGenerator {
//省略
public static class String implements Generator<java.lang.String> {
private int length = 7;
Generator<java.lang.Character> cg = new CountingGenerator.Character();
public String() {
}
public String(int length) {
this.length = length;
}
public java.lang.String next() {
char[] buf = new char[this.length];
for(int i = 0; i < this.length; ++i) {
buf[i] = (java.lang.Character)this.cg.next();
}
return new java.lang.String(buf);
}
}
}
好了,找到源头了,原来它继承了 Generator<java.lang.String>,但我就不理解了,那为啥String[] strings = FArray.fill(new String[7], new RandomGenerator.String(10));
会报错呢?类型参数 T 推断成 String 不就皆大欢喜了吗,怎么它还说推断不出来了呢。
第二个报错也没理解。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.