Java 枚举正试图通过不存在的公共初始值设定项初始化自身
我有一个枚举,布局。我使用私有初始值设定项定义了一些成员(不记得正确的术语)。出于某种原因,它声称“布局是抽象的;无法实例化“(Intellij Idea)。我声明的私有初始值设定项显示了一条警告,表示它从未被使用过。代码:Java 枚举正试图通过不存在的公共初始值设定项初始化自身,java,intellij-idea,enums,initialization,Java,Intellij Idea,Enums,Initialization,我有一个枚举,布局。我使用私有初始值设定项定义了一些成员(不记得正确的术语)。出于某种原因,它声称“布局是抽象的;无法实例化“(Intellij Idea)。我声明的私有初始值设定项显示了一条警告,表示它从未被使用过。代码: public static enum Layout { CHARGE("Charge", false, false), FESS("Fess", true, true), PALE("Pale", true, true), QUARTE
public static enum Layout {
CHARGE("Charge", false, false),
FESS("Fess", true, true),
PALE("Pale", true, true),
QUARTERLY("Quarterly", true, false),
PARTY_PER_PALE("Party per pale", true, false),
BORDURE("Bordure", true, false),
PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),
SCARPE("Scarpe", true, false),
THREE("Three", false, false),
COUNTERCHARGED("Countercharged", false, false);
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
public abstract String blazon(CoatOfArms paramCoatOfArms);
public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
由于您在
enum
中声明了abstract
方法,因此它被认为是abstract
(类似于一个抽象类),这就是您无法实例化它的原因。您也不能将其声明为静态
固定枚举:
public enum Layout {
CHARGE("Charge", false, false),
FESS("Fess", true, true),
PALE("Pale", true, true),
QUARTERLY("Quarterly", true, false),
PARTY_PER_PALE("Party per pale", true, false),
BORDURE("Bordure", true, false),
PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),
SCARPE("Scarpe", true, false),
THREE("Three", false, false),
COUNTERCHARGED("Countercharged", false, false);
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
由于您在
enum
中声明了abstract
方法,因此它被认为是abstract
(类似于一个抽象类),这就是您无法实例化它的原因。您也不能将其声明为静态
固定枚举:
public enum Layout {
CHARGE("Charge", false, false),
FESS("Fess", true, true),
PALE("Pale", true, true),
QUARTERLY("Quarterly", true, false),
PARTY_PER_PALE("Party per pale", true, false),
BORDURE("Bordure", true, false),
PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),
SCARPE("Scarpe", true, false),
THREE("Three", false, false),
COUNTERCHARGED("Countercharged", false, false);
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
两个问题:1)不能将枚举定义为
static
。事实上,它们已经是。2) 不能在枚举中包含抽象方法。您必须完全定义所有方法。有两个问题:1)不能将枚举定义为static
。事实上,它们已经是。2) 不能在枚举中包含抽象方法。您必须完全定义所有方法。您应该将抽象方法排除在枚举之外
public abstract class MyClass {
public static enum Layout {
CHARGE("Charge", false, false),
FESS("Fess", true, true),
PALE("Pale", true, true),
QUARTERLY("Quarterly", true, false),
PARTY_PER_PALE("Party per pale", true, false),
BORDURE("Bordure", true, false),
PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),
SCARPE("Scarpe", true, false),
THREE("Three", false, false),
COUNTERCHARGED("Countercharged", false, false);
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
public abstract String blazon(CoatOfArms paramCoatOfArms);
public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
}
您应该将抽象方法排除在枚举之外
public abstract class MyClass {
public static enum Layout {
CHARGE("Charge", false, false),
FESS("Fess", true, true),
PALE("Pale", true, true),
QUARTERLY("Quarterly", true, false),
PARTY_PER_PALE("Party per pale", true, false),
BORDURE("Bordure", true, false),
PARTY_PER_BEND_SINISTER("Party per bend sinister", true, false),
SCARPE("Scarpe", true, false),
THREE("Three", false, false),
COUNTERCHARGED("Countercharged", false, false);
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
public abstract String blazon(CoatOfArms paramCoatOfArms);
public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
}
无法初始化抽象对象。由于枚举常量是初始化的,因此它们必须是非抽象的。因此,必须实施所有方法 您有两种选择:
public enum Layout {
CHARGE("Charge", false, false) {
@Override
public String blazon(CoatOfArms paramCoatOfArms) {
// ...
}
@Override
public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
// ...
}
@Override
public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
// ...
}
},
FESS("Fess", true, true) {
@Override
public String blazon(CoatOfArms paramCoatOfArms) {
// ...
}
@Override
public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
// ...
}
@Override
public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
// ...
}
}
/*
rest of the constants, each implementing the methods
*/ ;
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
public abstract String blazon(CoatOfArms paramCoatOfArms);
public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
static
关键字也可能不属于那里,这取决于枚举的声明位置。抽象对象无法初始化。由于枚举常量是初始化的,因此它们必须是非抽象的。因此,必须实施所有方法
您有两种选择:
public enum Layout {
CHARGE("Charge", false, false) {
@Override
public String blazon(CoatOfArms paramCoatOfArms) {
// ...
}
@Override
public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
// ...
}
@Override
public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
// ...
}
},
FESS("Fess", true, true) {
@Override
public String blazon(CoatOfArms paramCoatOfArms) {
// ...
}
@Override
public void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3) {
// ...
}
@Override
public void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2) {
// ...
}
}
/*
rest of the constants, each implementing the methods
*/ ;
public final String name;
public final boolean hasSecondary;
public final boolean chargeInSecondary;
public abstract String blazon(CoatOfArms paramCoatOfArms);
public abstract void draw(CoatOfArms paramCoatOfArms, MyDraw paramMyDraw, double paramDouble1, double paramDouble2, double paramDouble3);
public abstract void drawLayout(MyDraw paramMyDraw, double paramDouble1, double paramDouble2);
private Layout(String name, boolean hasSecondary, boolean chargeInSecondary) {
this.name = name;
this.hasSecondary = hasSecondary;
this.chargeInSecondary = chargeInSecondary;
}
}
static
关键字也可能不属于那里,这取决于枚举的声明位置。如果向枚举中添加抽象方法,并且不对每个枚举常量重写它们,您认为会发生什么情况?我看到这段代码的编译错误,因为抽象方法没有过度使用。fabian是对的,枚举值需要覆盖枚举中的所有抽象方法。还要删除该静态。如果将抽象方法添加到枚举中,并且不对每个枚举常量重写它们,您认为会发生什么?我看到此代码的编译错误,因为抽象方法没有被重写。fabian是对的,您的枚举值需要重写枚举中的所有抽象方法。也要去除静电干扰。