作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑以下几点:
public class GenericTest {
static void print(int x) {
System.out.println("Int: " + x);
}
static void print(String x) {
System.out.println("String: " + x);
}
static void print(Object x) {
System.out.println("Object: " + x);
}
static <T> void printWithClass(T t) {
print(t);
}
public static void main(String argsp[]) {
printWithClass("abc");
}
}
它打印对象:abc。为什么不打印 String: abc?
最佳答案
这是因为 Java type erasure : 你的
static <T> void printWithClass(T t) {
print(t);
}
实际上是
之上的语法糖static void printWithClass(Object t) {
print(t);
}
公平地说,“语法糖”让编译器可以做一些非常好的和重要的检查,但在运行时只有一个 printWithClass
方法的副本,它使用 java.lang.Object
作为变量 t
的类型。
如果您体验过其他语言(C#、C++ 模板、Ada)中的泛型,类型删除可能与您所知道的相反,但这就是它在幕后的工作方式。
关于Java泛型——类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312978/
我是一名优秀的程序员,十分优秀!