2010-10-12 106 views
4

下面是相关代码:Java泛型难题

public interface Artifact {}  
public interface Bundle implements Artifact {} 
public interface Component implements Artifact {} 

public interface State<T extends Artifact> { 
    void transition(T artifact, State<T> nextState); 
} 

这让我定义这个枚举:

enum BundleState implements State<Bundle> { 

    A, B, C; 

    public void transition(Bundle bundle, State<Bundle> nextState) {} 
    } 
} 

但方法签名,我要的是:

public void transition(Bundle bundle, BundleState nextState) {} 
    } 

但这不会编译。显然问题在于我如何在State界面中定义T,但我无法弄清楚如何解决它。

谢谢, 唐

回答

3

方法不是存在于Java逆变。你可能超负荷并且都有,但是没有多少意义。

可能的话,你可以声明State,就像这样:

public interface State<THIS extends State<THIS, A>, A extends Artifact> { 
    void transition(A artifact, THIS nextState); 
} 

THIS extends State<THIS, A>可能是错误的。这取决于你想要做什么。

(当使用泛型参数混合单字母枚举常数可能是一个坏主意,特别是。)

10

事情可能开始变得笨拙,但你变化State到:

public interface State<T extends Artifact, U extends State<T, U>> { 
    void transition(T artifact, U nextState); 
} 

而且将BundleState更改为:

public enum BundleState implements State<Bundle, BundleState> { 
    A, B, C; 

    public void transition(Bundle bundle, BundleState nextState) {} 
} 
1

transition(Bundle,BundleState)与您的cu不匹配rrent State接口,除非您按照其他人的建议更改它。您也可以保留接口

enum BundleState implements Artifact, State<BundleState> { 
    A, B, C; 
    public void transition(BundleState bundle, State<BundleState> nextState) 
    { 
    } 
} 
0
enum BundleState implements State<Bundle> 
{ 
    A, B, C; 

    public void transition(Bundle bundle, BundleState nextState) 
    { 
     transition(bundel, (State<Bundle>)nextState); 
    } 

    public void transition(Bundle bundle, State<Bundle> nextState) {} 
}