2016-04-15 54 views
4
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,我錯了嗎?

我想這樣做,以避免這個問題,也專門的參數,但它是不允許的,我明白why

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

class Truck extends Vehicle 
{ 
    @Override 
    void collide(Truck v){super.collide(v);} 
} 
  • 解決辦法?
  • 回答

    2
    1. 它不(見2)
    2. 你說的很對,這是ambiguos,將拋出一個異常
    3. 基本上,你有以下幾種可能:

    進樣全部:

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

    資格不知何故:你寫資格標註去機智h本,沿着線:

    @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; 
    
    +0

    感謝您什麼你的答案。通過這樣做,我需要指定我想要哪種車輛,但我不知道。你可以看到我編輯的帖子。 –

    1

    其次回答你的後期編輯(如你進入一個完全不同的問題域):

    對於參數的專門化,您只有參數化類本身的可能性,alon克行:

    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; 
    

    不過,從你的例子來看,這可能不是你想要;-)