当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有在尖括号之间的类型信息都将被丢弃。这种擦除不仅会擦除使用该Java类时传入的类型实参,而且会擦除所有的泛型信息,也就是擦除所有尖括号里的信息。
import java.util.ArrayList;
import java.util.List;
public class ErasureTest {
public static void main(String[] args) {
Apple<Integer> a = new Apple<Integer>(6);
for(String apple : a.getApples()) {
System.out.println(apple);
}
Apple b = a;
// 提示“不兼容的类型”编译错误
for(String apple : b.getApples()) {
System.out.println(apple);
}
}
}
class Apple<T extends Number> {
T size;
public Apple(T size) {
this.size = size;
}
public String toString() {
return "Apple[size=" + size + "]";
}
public List<String> getApples() {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
list.add(new Apple<Integer>(10*i).toString());
}
return list;
}
}
分享到:
相关推荐
本文将深入探讨Java泛型类型擦除的概念,并介绍在类型擦除后,为了保持泛型的安全性和便利性,Java设计者所采取的一些补偿机制。 1. **类型擦除**: - 在编译期间,所有的泛型类型信息都会被替换为它们的实际类型...
在 Java 语言中,泛型类型擦除的机制使得开发者难以理解和使用泛型,例如,在 Java 中,我们可以定义一个泛型类 `ArrayList<T>`,其中 `T` 是类型参数,但是,在编译后的字节码文件中,泛型类型信息已经被擦除,所有...
然而,Java 的泛型在运行时是被擦除的,这意味着在运行时刻,所有的泛型类型信息都会丢失,无法直接用来创建对象或进行类型检查。这导致我们无法使用 `new T()` 或 `instanceof` 这样的操作。为了解决这个问题,我们...
虽然这种机制带来了一些限制,如运行时类型错误、泛型类型参数不能是基本类型、无法创建泛型类型的实例、泛型类型参数不能使用instanceof、无法重载泛型方法等,但我们可以通过一些编程技巧来规避这些问题。...
桥接方法是 Java 编译器生成的特殊方法,用于解决泛型类型擦除后可能出现的类型不匹配问题。在编译时,编译器会生成桥接方法,以便在泛型类型擦除后,仍然能够保留类型安全性。 例如,假设我们有一个泛型类 Pair,...
泛型擦除是指在编译时,Java 编译器将泛型类型参数擦除,替换为 Object 或其他类。例如,在编译时,`List<String>` 将被擦除为 `List`,使用 `Object` 作为类型参数。 桥接方法是指在子类中重写父类的方法时,Java ...
"Java 泛型总结(一):基本用法与类型擦除" Java 泛型是 Java 语言中的一种强大功能,它可以使代码更加简洁、安全。下面是对 Java 泛型的基本用法和类型擦除机制的介绍。 泛型的基本用法 ------------- 泛型是...
2. 类型擦除:Java 编译器会将泛型类型擦除掉,替换为 Object 或者其他类型,这样可以实现向后兼容。 3. 边界:边界是指泛型类型参数的约束,例如 `<T extends Number>`。 泛型的使用场景 1. 集合类:Java 的集合...
另一方面,Java的泛型类型擦除带来了一定的灵活性,使得旧的无泛型代码能够与新的泛型代码兼容,这对于维护大型遗留项目尤其有利。然而,这也意味着Java开发者需要额外注意类型转换的安全性,避免出现...
在"泛型类型转换Demo"中,可能涉及到不同泛型类型的赋值转换。例如,如果我们有一个`List<Number>`,我们可以通过类型转换将其赋值给`List<Integer>`,因为Integer是Number的子类。但是,这种转换只能在满足继承...
这个过程由“类型擦除”实现。但是并非像许多开发者认为的那样,在 <..> 符号内的东西都被擦除了。看下面这段代码: public class ClassTest { public static void main(String[] args) throws Exception { ...
这样,泛型类型擦除保证不会为已参数化了的类型(paramterized types)产生新类,这样泛型能保证没有运行时的负载。 例如,下面的泛型类: ```java public class Node<T> { private T data; private Node<T> next...
可以看到,在编译后,泛型信息被擦除,所有的泛型类型都变成了原始类型 `ArrayList`。 泛型擦除的优点 泛型擦除有两个主要优点: 1. 提高了代码的可读性和可维护性,因为泛型信息在编译期被擦除,编译后的代码...
- 泛型擦除前的例子把这段Java代码编译成Class文件,然后再用字节码反编译后,將会发现泛型都不见了,又变回了Java泛型出现之前的写法,泛型类型都变回了原
Java中的类型擦除是指编译器在编译时将泛型类型擦除的过程。类型擦除可以提高代码的安全性和可读性,但也会带来一些限制。 ### 8.泛型的优点 泛型的引入提高了代码的安全性和可读性,消除了强制类型转换,提高了...
综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...
5. 擦除:Java的泛型在编译后会被类型擦除,这意味着在运行时,所有的泛型信息都会丢失。但是,编译器会在源代码中插入适当的类型检查和转换,以确保类型安全。因此,尽管在运行时无法直接访问泛型信息,但编译时的...
总的来说,JDK 5.0中的泛型类型为Java提供了类型安全的容器,但其工作原理和限制(如类型擦除、非协变性以及构造延迟)需要开发者充分理解和掌握,以便正确、安全地使用泛型。在实际编程中,理解这些概念可以帮助...
Java 泛型详解 Java 泛型是 Java 5 中引入的一种编程技术,旨在提高代码的复用性和类型安全性。泛型允许开发者编写出“非特定类型”的代码,能够...但是,需要注意泛型的边界和类型擦除,以确保代码的正确性和安全性。