面试题答案
一键面试代码示例
假设我们有一个泛型父类 Animal
和两个泛型子类 Dog
和 Cat
。
- 定义泛型父类:
class Animal<T> {
public void makeSound(T sound) {
System.out.println("Animal makes a sound: " + sound);
}
}
- 定义泛型子类并正确重写泛型方法:
class Dog extends Animal<String> {
@Override
public void makeSound(String sound) {
System.out.println("Dog barks: " + sound);
}
}
class Cat extends Animal<String> {
@Override
public void makeSound(String sound) {
System.out.println("Cat meows: " + sound);
}
}
- 确保类型安全的使用:
public class Main {
public static void main(String[] args) {
Animal<String> dog = new Dog();
dog.makeSound("Woof");
Animal<String> cat = new Cat();
cat.makeSound("Meow");
}
}
解释
- 保持类型安全:通过在子类中指定与父类泛型参数兼容的具体类型(在这个例子中,
Dog
和Cat
都使用String
作为泛型参数),确保在重写泛型方法时参数类型一致,从而保持类型安全。 - 实现多态性:在
main
方法中,我们使用父类类型来引用子类对象,这样就可以根据对象的实际类型来调用正确的makeSound
方法,实现了多态性。
在Java中,这种方式保证了在使用泛型类层次结构时既保持类型安全,又能有效地应用多态性。如果是其他编程语言,如C#,也有类似的实现思路,只不过语法略有不同。例如在C# 中:
class Animal<T>
{
public void MakeSound(T sound)
{
Console.WriteLine("Animal makes a sound: " + sound);
}
}
class Dog : Animal<string>
{
public override void MakeSound(string sound)
{
Console.WriteLine("Dog barks: " + sound);
}
}
class Cat : Animal<string>
{
public override void MakeSound(string sound)
{
Console.WriteLine("Cat meows: " + sound);
}
}
class Program
{
static void Main()
{
Animal<string> dog = new Dog();
dog.MakeSound("Woof");
Animal<string> cat = new Cat();
cat.MakeSound("Meow");
}
}
同样通过继承和重写泛型方法实现多态和类型安全。