[英]How do I restrict a generic type to specific types in java?
我有一个带有通用变量的类。 我想将该变量限制为一组类型(例如Car,Bike等),如下所示:
class Garage{
Class<K> ownerStaff;
public Garage(Car c){
this.ownerStaff = c;
}
public Garage(Bike b){
this.ownerStaff = b;
}
...
}
因此,“ genericVariable”只能是汽车,自行车或我想要的任何其他类型,但不能是任何东西。 我该怎么做?
注意:我认为我可以将父类设为“车辆”,然后以这种方式编写(如果我输入错误,请更正我)
class Garage<K extends Vehicle>{
Class<K> ownerStaff;
public Garage(Class<K> c){
this.ownerStaff = c;
}
}
但是我不希望有一个父类并使我的所有类都扩展为“ Vehicle”,并且当我实例化“ Garage”时可能不想输入例如Garage<Car>
。
谢谢
您最终将不得不具有某种常见的行为,否则将它们放置在同一Garage
中将毫无意义。 因此,正如@perelman建议的那样,只需在接口中声明此常见行为并使用该行为即可(无泛型):
public interface Vehicle {
// common behavior declared, if any
}
public class Car implements Vehicle {
// Implementation
}
public class Bike implements Vehicle {
// Implementation
}
public class Garage {
Vehicle vehicle;
public Garage(Vehicle v) {
vehicle = v;
}
}
重读您的问题,我想您想要的只是将ownerStaff
字段的类型为Class<?>
。 这使您可以用任何Class实例填充它,而不管其类型如何。
这里的旧答案:限制通用类型的唯一方法是使用<K extends Vehicle>
正如您已经说过的。 这具有能够在类中的K
实例上调用所有Vehicle
方法的附加优点。
当然,您可以只检查instanceof
的值类型,例如,在构造函数中,添加if (!(Car.class.isAssignableFrom(c) or Bike.class.isAssignableFrom(c))) throw new IllegalArgumentException("we only accept cars and bikes")
。 但是,这将是非常严格的检查,并且会阻止该类用户发明自己的车辆类型。
由于Java没有代数数据类型-即您不能说“类型A或类型B”,只能通过常见的超类型说“类型A和B”-这自然不是您可以做的。
解决此问题的一种方法是将Garage
的构造函数设为私有,仅为特定类型提供静态工厂方法:
class Garage<K> {
private Garage<K>(K thing) { this.thing = thing; } // hidden
private K thing;
public Garage<Car> newCarGarage(Car c) {
return new Garage<Car>(c);
}
//... similarly for other types you want to be allowed
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.