MST

星途 面试题库

面试题:Java泛型与多态性的结合

给定一个包含泛型类型参数的类层次结构,例如一个泛型父类和多个泛型子类。请阐述如何在保持类型安全的前提下,实现多态性的应用。以代码示例展示如何正确地重写泛型方法,以及在使用这些类时如何确保类型安全。
22.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码示例

假设我们有一个泛型父类 Animal 和两个泛型子类 DogCat

  1. 定义泛型父类
class Animal<T> {
    public void makeSound(T sound) {
        System.out.println("Animal makes a sound: " + sound);
    }
}
  1. 定义泛型子类并正确重写泛型方法
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);
    }
}
  1. 确保类型安全的使用
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");
    }
}

解释

  1. 保持类型安全:通过在子类中指定与父类泛型参数兼容的具体类型(在这个例子中,DogCat 都使用 String 作为泛型参数),确保在重写泛型方法时参数类型一致,从而保持类型安全。
  2. 实现多态性:在 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");
    }
}

同样通过继承和重写泛型方法实现多态和类型安全。