簡體   English   中英

如何在Java中將泛型類型限制為特定類型?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM