2013-05-06 2 views
0

Я определил простой базовый интерфейс, содержащий один метод с абстрактным классом в качестве параметра.Как использовать общий параметр метода в интерфейсе?

public interface IVisitor { 
    void visit(BaseVehicle vehicle); 
} 

Этот базовый интерфейс может быть расширен с помощью другого интерфейса, который должен быть в состоянии перегружать этот метод из базового интерфейса несколько раз с более конкретными классами.

public interface ISpecificVisitor extends IVisitor { 
    void visit(TruckCar car); 
    void visit(Lory car); 
} 

Можно ли написать базовый интерфейс с помощью дженериков, чтобы дополнительный интерфейс мог/должен перегружать более конкретный класс? Если да, как это будет выглядеть?

ответ

7

Это должно работать для вас:

public interface IVisitor<T extends BaseVehicle> { 
    void visit(T vehicle); 
} 
+0

@downvoter уход объяснить ваш запоздалый действие? –

0

Вы можете сделать это, но из-за типа стирания, вы не можете сделать это в элегантный способ:

public interface Vehicle {} 

public class Car implements Vehicle {} 

public class Boat implements Vehicle {} 

public interface IVisitor<C extends Vehicle, B extends Vehicle> { 
    // These methods have the same erasure, compile time error. 
    // void visit(C vehicle); 
    // void visit(B vehicle); 

    // ugly workaround. 
    void visitC(C vehicle); 
    void visitB(B vehicle); 
} 

public class SpecificVisitor implements IVisitor<Car, Boat> { 
    @Override 
    public void visitC(Car vehicle) {} 

    @Override 
    public void visitB(Boat vehicle) {} 
} 
Смежные вопросы