我应该用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);
}
}
答案 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
是超类的子类的“引用”。Vehicle
类添加了self()方法。请注意,self()
返回T
而不是Vehicle
,这意味着返回的对象类型是此具体的实现类。每个实现都必须返回this
。希望它可以解决您的问题。