Java中泛型类的泛型容器

时间:2019-01-23 20:24:14

标签: java generics

我应该用Java为“自我”写什么?我想要“自我”在这里指的是“ Vehicle的具体实现是什么类”。用Java可以做到吗?

import java.util.ArrayList;
import java.util.List;

abstract class Vehicle {
    private Garage<self> garage;

    void setGarage(Garage<self> g) {
        this.garage = g;
        g.vehicles.add(this);
    }
}

class Car extends Vehicle {
}

class Garage<T extends Vehicle> {
    List<T> vehicles = new ArrayList<>();

    void addVehicle(T t) {
        vehicles.add(t);
    }
}

public class GenericFoo {
    public static void main(String[] args) {
        Garage<Car> carGarage = new Garage<>();

        Car c = new Car();
        carGarage.addVehicle(c);
        c.setGarage(carGarage);
    }
}

1 个答案:

答案 0 :(得分:1)

可以创建等效的东西,但需要一些额外的工作。哈瓦看看下面的代码:

import java.util.ArrayList;
import java.util.List;

public class GenericsSample {

    public static void main(String[] args) {
        Garage<Car> carGarage = new Garage<>();

        Car c = new Car();
        carGarage.addVehicle(c);
        c.setGarage(carGarage);
    }

    abstract static class Vehicle<T extends Vehicle<T>> {

        private Garage<T> garage;

        void setGarage(Garage<T> g) {
            this.garage = g;
            g.vehicles.add(self());
        }

        abstract T self();
    }

    static class Car extends Vehicle<Car> {

        @Override
        Car self() {
            return this;
        }
    }

    static class Garage<T extends Vehicle<T>> {

        List<T> vehicles = new ArrayList<>();

        void addVehicle(T t) {
            vehicles.add(t);
        }
    }
}

重要的是:

  • Vehicle类参数化-实际上,T类型是Vehicle本身。我们需要它能够从父级获取实际类型。在我们的例子中,T代表Car(实际上可以代表任何子类)。 Vehicle<T extends Vehicle<T>>看起来有些棘手,但实际上,它很容易理解-T是超类的子类的“引用”。
  • self()方法-我向Vehicle类添加了self()方法。请注意,self()返回T而不是Vehicle,这意味着返回的对象类型是此具体的实现类。每个实现都必须返回this

希望它可以解决您的问题。