泛型(Generics)是一种编程语言特性,允许在定义类、接口和方法时使用类型参数。通过泛型,可以提高代码的复用性和类型安全性。派生类型是指从基类型继承而来的类型。
List<T>
。public <T> void print(T item)
。Comparable<T>
。ArrayList<T>
、HashMap<K, V>
。假设我们有一个基类 Animal
和几个派生类 Dog
、Cat
,我们希望将这些类的实例映射到一个表中。
import java.util.HashMap;
import java.util.Map;
class Animal {
private String name;
public Animal(String name) { this.name = name; }
public String getName() { return name; }
}
class Dog extends Animal {
public Dog(String name) { super(name); }
}
class Cat extends Animal {
public Cat(String name) { super(name); }
}
public class GenericMappingExample {
public static <T extends Animal> void mapAnimals(Map<String, T> map, T... animals) {
for (T animal : animals) {
map.put(animal.getName(), animal);
}
}
public static void main(String[] args) {
Map<String, Animal> animalMap = new HashMap<>();
Dog dog1 = new Dog("Buddy");
Cat cat1 = new Cat("Whiskers");
mapAnimals(animalMap, dog1, cat1);
for (Map.Entry<String, Animal> entry : animalMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue().getClass().getSimpleName());
}
}
}
原因:Java泛型在编译时会进行类型擦除,运行时无法获取泛型的具体类型信息。 解决方法:使用反射或其他方式在运行时获取类型信息,或者通过传递类型参数来解决。
原因:Java不允许直接创建泛型类型的数组,如 new T[10]
。
解决方法:使用 Array.newInstance
方法或通过容器类(如 ArrayList
)来间接实现。
原因:在使用泛型时,可能会遇到需要灵活处理不同类型的情况。
解决方法:使用通配符 ?
和边界(如 <? extends T>
或 <? super T>
)来增加灵活性。
通过上述方法和示例代码,可以有效地将泛型类型的所有派生类型映射到一个表中,并解决常见的泛型使用问题。
领取专属 10元无门槛券
手把手带您无忧上云