2017-02-13 37 views
1
interface A<T extends B</*?*/>> { 
    method(T param); 
} 

interface B<U extends A> { 
    // ... 
} 

在上面的代码片断中,如何表示方法A#method应该只接受参数,该参数是调用方法的类型(或其后代)参数化的对象。如何将type参数的值绑定到`this`的类型?

我想才达到这样的事:

interface Vehicle<T extends SteeringDevice</*?*/> { 
    default steer(T steeringDevice) { 
     // ... 
    } 
} 

interface SteeringDevice<U extends Vehicle> { 
    // ... 
} 

// ----- 

class Car implements Vehicle<SeeringWheel> { 
    // ... 
} 

class SteeringWheel implements SteeringDevice<Car> { 
    // ... 
} 

// ----- 

class Bike implements Vehicle<Handlebars> { 
    // ... 
} 

class Handlebars implements SteeringDevice<Bike> { 
    // ... 
} 

...这里有可能使安全地调用new Car().steer(new SteeringWheel())但不new Car().steer(new Handlebars())

+0

你是不是想找点像'>'? – EJP

+0

你真的需要'SteeringDevice'是通用的吗?如果您不这样做,请取消类型参数,并且您应该能够轻松实现所有功能。如果你这样做,请提供更多关于你想要做什么的详细信息,这需要type参数,以便我们可以提供一个解决方案(可能需要重构)。 – ajb

回答

2

我想这你想要做什么:

interface Vehicle<T extends SteeringDevice<? extends Vehicle<T>>> { 
    default void steer(T steeringDevice) {} 
} 

interface SteeringDevice<U extends Vehicle<? extends SteeringDevice<U>>> { 
    // ... 
} 

这将迫使两个兼容的实现交叉引用对方。将参数更改为不兼容的类型现在将触发配对类中的编译错误。

上面的一个潜在问题是它允许多个实现SteeringDevice<Car>。您可以配对更明确加入了自我类型参数:

interface Vehicle<U extends Vehicle<U, T>, T extends SteeringDevice<T, U>> { 
    default void steer(T steeringDevice) {} 
} 

interface SteeringDevice<T extends SteeringDevice<T, U>, U extends Vehicle<U, T>> { 
    // ... 
} 

class Car implements Vehicle<Car, SteeringWheel> { 
    // ... 
} 

class SteeringWheel implements SteeringDevice<SteeringWheel, Car> { 
    // ... 
} 

仍然可能创造的SteeringDevice<SteeringWheel, Car>另一种实现方式,因为Java没有一个真正的自我型,但至少它使违规更明显。它还具有在无效类型参数上打破两个类的优点。

相关问题