Java 枚举是原始类型。对泛型类型枚举的引用<;E>;应该参数化

Java 枚举是原始类型。对泛型类型枚举的引用<;E>;应该参数化,java,generics,Java,Generics,我在java代码中收到以下警告 Enum is a raw type. References to generic type Enum<E> should be parameterized 如果方法可以返回各种枚举,请使用 公共抽象枚举进程(。。。 如果调用方知道要使用哪个枚举,请使用 公共抽象T进程(。。。 如果方法可以返回各种枚举,请使用 公共抽象枚举进程(。。。 如果调用方知道要使用哪个枚举,请使用 公共抽象T进程(。。。 Enum是原始类型。对泛型类型Enum的引用应

我在java代码中收到以下警告

Enum is a raw type. References to generic type Enum<E> should be parameterized

如果方法可以返回各种枚举,请使用

公共抽象枚举进程(。。。
如果调用方知道要使用哪个枚举,请使用

公共抽象T进程(。。。

如果方法可以返回各种枚举,请使用

公共抽象枚举进程(。。。
如果调用方知道要使用哪个枚举,请使用

公共抽象T进程(。。。
Enum
是原始类型。
对泛型类型
Enum
的引用应参数化

。这就是警告消息所指的内容,它告诉您“枚举应参数化”
Enum
。但该警告是一种误导

“我不确定纠正此警告的正确措施…”

Message.process()
方法的设计可能需要重构

“消息抽象类的用户只需调用枚举上的oridinal(),而不知道枚举的基本类型…”

如果您确信
Enum.ordinal()
是所有将被调用的函数,并且如果您可以控制应用程序API中将公开的
Enum
,那么您可以选择引入一个接口(比如说一个
ordinable
)来指定
ordinal()
方法。然后所有应用程序的
枚举
都可以实现
可排序的
(或任何你想给它起的名字)

类似于

public interface Ordinalable { 

    int ordinal( );
}

…

enum Foo implements Ordinalable { 
    A, B, C … ;
}

…

enum Bar implements Ordinalable { 

    UNOS, DOS, TRES;

}

…

public abstract class Message { 
    …
    public abstract Ordinalable process( … ){ … }
    …
}

…

public class AMessage extends Message {

    @Override
    public Ordinalable process( ){ 
        return Foo.A;
    }
}

…

public class BMessage extends Message { 

    @Override
    public Ordinalable process( ){ 
        return Foo.B;
    }
}

…

public class DuoMessage extends Message { 

    @Override
    public Ordinalable process( ){ 
        return Bar.DOS;
    }
}
…可以称之为

Message msg = new AMessage( );
    
int ordinal = msg.process( ).ordinal( );
…
msg = new BMessage( );
    
ordinal = msg.process( ).ordinal( );
…
msg = new DuoMessage( );
    
ordinal = msg.process( ).ordinal( );
…
你可以看到

Enum
是原始类型。
对泛型类型
Enum
的引用应参数化

。这就是警告消息所指的内容,它告诉您“枚举应参数化”
Enum
。但该警告是一种误导

“我不确定纠正此警告的正确措施…”

Message.process()
方法的设计可能需要重构

“消息抽象类的用户只需调用枚举上的oridinal()
,而不知道枚举的基本类型…”

如果您确信
Enum.ordinal()
是所有将被调用的函数,并且如果您可以控制应用程序API中将公开的
Enum
,那么您可以选择引入一个接口(比如说一个
ordinable
)来指定
ordinal()
方法。然后所有应用程序的
枚举
都可以实现
可排序的
(或任何你想给它起的名字)

类似于

public interface Ordinalable { 

    int ordinal( );
}

…

enum Foo implements Ordinalable { 
    A, B, C … ;
}

…

enum Bar implements Ordinalable { 

    UNOS, DOS, TRES;

}

…

public abstract class Message { 
    …
    public abstract Ordinalable process( … ){ … }
    …
}

…

public class AMessage extends Message {

    @Override
    public Ordinalable process( ){ 
        return Foo.A;
    }
}

…

public class BMessage extends Message { 

    @Override
    public Ordinalable process( ){ 
        return Foo.B;
    }
}

…

public class DuoMessage extends Message { 

    @Override
    public Ordinalable process( ){ 
        return Bar.DOS;
    }
}
…可以称之为

Message msg = new AMessage( );
    
int ordinal = msg.process( ).ordinal( );
…
msg = new BMessage( );
    
ordinal = msg.process( ).ordinal( );
…
msg = new DuoMessage( );
    
ordinal = msg.process( ).ordinal( );
…

您可以看到。

Enum怎么样?“消息抽象类的用户只需在Enum上调用oridinal()“-我假设您的意思是,具体的
消息
实现的消费者不会调用任何其他
Enum
方法。是这样吗?-”不知道Enum的基本类型“-你的应用程序的消费者不会知道
Enum
的基本类型。但是,作为API的作者,你是否可以控制你的应用程序API将公开的
Enum
的基本类型?我提出了一个解决方案,它基于对这两个问题的两个答案都是肯定的。TIA作为你的回答。那么
Enum如何?”
?“Message abstract类的用户只是在枚举上调用oridinal()”—我假设您的意思是,具体的
消息
实现的消费者不会调用任何其他
枚举
方法。是这样吗?-“不知道枚举的基本类型。”“-你的应用程序的消费者不会知道
Enum
的基本类型。但是,作为API的作者,你是否可以控制你的应用程序API将公开的
Enum
的基本类型?我提出了一个解决方案,该解决方案基于对这两个问题的两个答案:是。请回答TIA。第二个是unsafe,尽管如此。该方法说它可以返回调用方期望的任何类型,而不知道该类型是什么。但是,第二个是不安全的。该方法说它可以返回调用方期望的任何类型,而不知道该类型是什么。