繁体   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