有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java泛型类型作为抽象方法的参数?

我会尽可能地问这个问题,不要用双关语

假设我有一个对象“车库”,它作为汽车的容器。它看起来像这样:

public abstract class Garage {
    public abstract List<? extends Car> getCars();
    public abstract void addCarToGarage(Car car);
}

因为我很富有,我会有不同类型的车库,一些只装我的跑车,另一个只装我的SUV等等

我的一个车库看起来像这样:

public class SportCarGarage extends Garage {
    @Override
    public List<SportCar> getCars() {
        // code to return the cards
    }

    @Override
    public void addCarToGarage(Car car){
        // code to add car to garage
    }
}

现在你可能已经看到我的问题了。我可以实现getCars(),这样它将返回一个SportCar列表。但是如果我调用addCarToGarage,我需要检查每辆车的类型,如果有人试图在我的SportCarGarage中添加SUV,我不会得到语法错误

我想要这样的东西:

public abstract class Garage {
    public abstract List<? extends Car> getCars();
    public abstract void addCarToGarage(? extends Car car);
}

但这只会给我一个语法错误。我想有一个简单的解决办法,我只是不知道该找什么。希望你能帮忙


共 (4) 个答案

  1. # 1 楼答案

    您可以将Garage设为泛型,并在addCarToGarage方法中重新使用该类型:

    public abstract class Garage<T extends Car> {
        public abstract List<T> getCars();
        public abstract void addCarToGarage(T car);
    }
    

    然后,SportCarGarage将如下所示:

    public class SportCarGarage extends Garage<SportCar> {
        @Override
        public List<SportCar> getCars() {
            // code to return the cards
        }
    
        @Override
        public void addCarToGarage(SportCar car){
            // code to add car to garage
        }
    }
    
  2. # 2 楼答案

    当然,您只需将车库设置为通用:

    public abstract class Garage<T extends Car> {
       public abstract List<T> getCars();
       public abstract void addCarToGarage(T car);
    }
    

    那你就可以了

    Garage<SportsCar> sportsGarage = .... 
    

    我将类保留为抽象类,但也许您不需要再创建子类,只是为了适应不同类型的汽车

    现在看来,您至少可以以通用的方式实现这两种方法

    如果你真的想要专门的子类,你可以这样做

    class SportsGarage extends Garage<SportsCar> {
          ....
    }
    
    Garage<SportsCar> sportsGarage = new SportsGarage();
    
  3. # 3 楼答案

    您需要参数化整个类

    public abstract class Garage<T extends Car>  {
        public abstract List<T> getCars();
        public abstract void addCarToGarage(T car);
    }
    

    这还将确保在所有方法之间使用一致的类型

    编辑:打字错误

  4. # 4 楼答案

    你不是基本上只想要以下几点吗

    public abstract class Garage<T extends Car> {
        public abstract List<T> getCars();
        public abstract void addCarToGarage(T car);
    }
    

    public class SportCarGarage extends Garage<SportCar> {
        @Override
        public List<SportCar> getCars() {
            // code to return the cards
        }
    
        @Override
        public void addCarToGarage(SportCar car){
            // code to add car to garage
        }
    }