Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型难题_Java_Generics - Fatal编程技术网

Java泛型难题

Java泛型难题,java,generics,Java,Generics,以下是相关代码: 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);

以下是相关代码:

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);
}
但这并不适用于编译。显然,问题在于我如何在
State
界面中定义
T
,但我不知道如何修复它

谢谢,
Don方法在Java中不是逆变的。你可以超负荷,两者兼得,但这没有多大意义

可能,您可以声明
状态
,如下所示:

public interface State<THIS extends State<THIS, A>, A extends Artifact> {
    void transition(A artifact, THIS nextState);
}
公共接口状态{
虚空转换(一个工件,下一个状态);
}
此扩展状态可能是错误的。这取决于你想做什么


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

事情可能开始变得不方便,但您可以将
状态更改为:

public interface State<T extends Artifact, U extends State<T, U>> {
    void transition(T artifact, U nextState);
}
公共接口状态{
空洞过渡(T伪影,U下一状态);
}
并更改为:

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

    public void transition(Bundle bundle, BundleState nextState) {}
}
public enum BundleState实现状态{
A、 B,C;
公共无效转换(Bundle Bundle,BundleState nextState){}
}
转换(Bundle、BundleState)与当前状态接口不匹配,除非您按照其他人的建议进行更改。您还可以保留与的接口

enum BundleState implements Artifact, State<BundleState> {
    A, B, C;
    public void transition(BundleState bundle, State<BundleState> nextState)
    {
    }
}
enum BundleState实现工件、状态{
A、 B,C;
公共无效转换(BundleEstate bundle、State nextState)
{
}
}
枚举绑定状态
{
A、 B,C;
公共无效转换(Bundle Bundle、BundleState nextState)
{
过渡(邦德尔,(邦)下一州);
}
公共无效转换(Bundle Bundle,State nextState){}
}
public enum BundleState implements State<Bundle, BundleState> {
    A, B, C;

    public void transition(Bundle bundle, BundleState nextState) {}
}
enum BundleState implements Artifact, State<BundleState> {
    A, B, C;
    public void transition(BundleState bundle, State<BundleState> nextState)
    {
    }
}
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) {}
}