[英]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.