Java:实验泛型
最后,我尝试了一些泛型。我想出了这段代码:Java:实验泛型,java,generics,Java,Generics,最后,我尝试了一些泛型。我想出了这段代码: public class Test { static <T> void f(T x) { x = (T) (Integer) 1234; System.out.println(x); } public static void main(String[] args) { f("a"); f(1); f('a'); f(1
public class Test {
static <T> void f(T x) {
x = (T) (Integer) 1234;
System.out.println(x);
}
public static void main(String[] args) {
f("a");
f(1);
f('a');
f(1.5);
f(new LinkedList<String>());
f(new HashMap<String, String>());
}
}
没有例外!这是怎么可能的呢?这是因为(关于这一点,已经有很多人写了,只有谷歌这个词)。将f
编译为字节码后,该方法可能如下所示:
static void f(Object x) {
x = (Object) (Integer) 1234;
System.out.println(x);
}
因此,
System.out.println
将只调用对象x
上的toString
方法,而在您的情况下,由于类型擦除,它是。发件人:
Java语言中引入了泛型以提供更紧密的类型
在编译时进行检查,以支持泛型编程。到
实现泛型,Java编译器将类型擦除应用于:
- 将泛型类型中的所有类型参数替换为其边界或 对象,如果类型参数是无界的。产生的字节码, 因此,只包含普通类、接口和方法
- 如有必要,插入类型强制转换以保持类型安全
- 生成桥接方法以在扩展泛型类型中保留多态性
这是一个非常棒的答案:小心点,你险些偏离了:“为什么泛型不象C++模板那样工作?”当你复制外部资源的单词时,一定要确保你正确引用并链接原始的措辞。
static void f(Object x) {
x = (Object) (Integer) 1234;
System.out.println(x);
}