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) {}
}