注入和继承

5
abstract class Vehicle
{
   void collide(Vehicle v){}
}

class Car extends Vehicle
{
   @Override 
   void collide(Vehicle v){super.collide(v);}
}  

class Truck extends Vehicle
{
   @Override 
   void collide(Vehicle v){super.collide(v);}
}  

如果我执行以下操作:
@Inject   
Vehicle vehicle;
  1. @Inject 如何知道要实例化哪个对象?
  2. 我认为这会抛出一个 AmbiguousResolutionException 异常,我错了吗?

我想这样做是为了避免这个问题,同时也可以专门处理参数,但这是不被允许的,我理解 原因

class Car extends Vehicle
{
   @Override 
   void collide(Car v){super.collide(v);}
}  

class Truck extends Vehicle
{
   @Override 
   void collide(Truck v){super.collide(v);}
}  

什么是解决方法(workaround)?
2个回答

3
  1. 它没有(见2)
  2. 你是完全正确的,它是模棱两可的,并且会抛出异常
  3. 基本上,你有以下几种可能性:

注入所有:

@Inject Instance<Vehicle> allVehicles; // see Instance docs on how to work with this

某种方式进行限定:您可以编写与此相关的限定注释,例如:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface Small {}

...

@Small
class Car extends Vehicle { ... }

...

@Inject @Small Vehicle thisWillBeACar;

谢谢您的回答。通过这样做,我需要指定我想要哪种类型的车辆,而我不知道那个。您可以查看我的编辑过的帖子。 - Charles Follet

1
你编辑后的帖子中的第二个答案(因为你在这里进入了完全不同的问题领域):
对于参数的专业化,你只能将类本身进行参数化,例如:
abstract class Vehicle<T> {  // T is the "collision partner class"
    abstract void collide(T v);
}

class Car extends Vehicle<Car> {
    @Override 
    void collide(Car v) { ... }
}

你可以注入一个特殊的类型:
@Inject Vehicle<Car> thisIsACar;

然而,从您的示例来看,这可能不是您想要的;-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接