注入与继承

Cha*_*let 5 java inheritance dependency-injection

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);}
}  
Run Code Online (Sandbox Code Playgroud)

如果我做 :

@Inject   
Vehicle vehicle;
Run Code Online (Sandbox Code Playgroud)
  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);}
}  
Run Code Online (Sandbox Code Playgroud)
  1. 解决方法是什么?

mtj*_*mtj 3

  1. 事实并非如此(见2)
  2. 你说得很对,这是模棱两可的,会抛出异常
  3. 基本上,您有以下可能性:

全部注入:

@Inject Instance<Vehicle> allVehicles; // see Instance docs on how to work with this
Run Code Online (Sandbox Code Playgroud)

以某种方式进行限定:您可以编写限定符注释来配合此操作,大致如下:

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

...

@Small
class Car extends Vehicle { ... }
Run Code Online (Sandbox Code Playgroud)

...

@Inject @Small Vehicle thisWillBeACar;
Run Code Online (Sandbox Code Playgroud)