java中泛型类的泛型容器

java中泛型类的泛型容器,java,generics,Java,Generics,我应该为Java中的“self”编写什么?我希望“self”在这里的意思是“车辆的具体实现是什么级别的”。这在Java中可能吗 import java.util.ArrayList; import java.util.List; abstract class Vehicle { private Garage<self> garage; void setGarage(Garage<self> g) { this.garage = g;

我应该为Java中的“self”编写什么?我希望“self”在这里的意思是“车辆的具体实现是什么级别的”。这在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);
    }
}
import java.util.ArrayList;
导入java.util.List;
抽象类车辆{
私人车库;
停车场(g停车场){
this.garage=g;
g、 车辆。添加(本);
}
}
二等车{
}
班级车库{
列出车辆=新的ArrayList();
无效添加车辆(T){
车辆.增加(t);
}
}
公共类GenericFoo{
公共静态void main(字符串[]args){
车库车库=新车库();
c车=新车();
汽车修理厂。添加车辆(c);
c、 停车场(车库);
}
}

可以创建一些等效的东西,但需要一些额外的努力。请看下面的代码:

import java.util.ArrayList;
导入java.util.List;
公共类泛型示例{
公共静态void main(字符串[]args){
车库车库=新车库();
c车=新车();
汽车修理厂。添加车辆(c);
c、 停车场(车库);
}
抽象静态类车辆{
私人车库;
停车场(g停车场){
this.garage=g;
g、 添加(self());
}
抽象T self();
}
静态级轿车{
@凌驾
汽车自我{
归还这个;
}
}
静态车库{
列出车辆=新的ArrayList();
无效添加车辆(T){
车辆.增加(t);
}
}
}
这里重要的是:

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

希望它能解决您的问题。

您通常只需使用
this
。您不能做任何类似的事情。在scala中使用“this.type”是可能的。我只是在java中找不到它。。。