Java中基于参数动态选择Enum时getCodigoAsString方法无法调用如何解决
问题根因
你当前代码报错的核心原因是:java.lang.Enum是所有枚举类的公共父类,但它本身没有定义你自己实现的getCodigoAsString()方法,你用Enum<?>通配符接收枚举实例时,编译器只能识别Enum类自带的方法,无法调用你自定义的枚举方法。
解决方案(标准实现,无反射、编译期可查错)
1. 定义公共接口抽象通用行为
所有你的Chaves_xx系列枚举都要实现这个接口,把通用方法声明在接口里:
public interface ChaveCanal { // 声明你需要调用的通用方法 String getCodigoAsString(); // 如果你还需要调用codigo、tipo等属性的getter,也可以一起声明在这 }
2. 修改所有枚举类实现公共接口
以Chaves_35为例,只需要加接口实现声明即可,原有代码不需要改动:
import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter // 新增实现接口 public enum Chaves_35 implements ChaveCanal { MODELO_DISPOSITIVO(1234,"TEXT","IN","Modelo Dispositivo"), DISPOSITIVO_SUPORTA_MULTI_TAREFA(4423,"TEXT","IN","Dispositivo Suporta Multi Tarefa"), NOME_DISPOSITIVO(7845,"TEXT","IN","Nome Dispositivo"), IDIOMA_DISPOSITIVO(3288,"TEXT","IN","Idioma Dispositivo"), ; private int codigo; private String tipo; private String fluxo; private String descricao; public String getCodigoAsString() { return String.valueOf(codigo); } }
所有Chaves_6、Chaves_8等系列枚举都做同样的接口实现修改。
3. 修改枚举选择类的返回值类型
把原来返回Enum<?>[]改成返回ChaveCanal[]:
public class ChavesCanal { public static ChaveCanal[] BuscaChavesCanal(int idCanal) { ChaveCanal[] resp = null; switch (idCanal) { case 6: resp = Chaves_6.values(); break; case 8: resp = Chaves_8.values(); break; case 10: resp = Chaves_10.values(); break; case 17: resp = Chaves_17.values(); break; case 21: resp = Chaves_21.values(); break; case 22: resp = Chaves_22.values(); break; case 27: resp = Chaves_27.values(); break; case 28: resp = Chaves_28.values(); break; case 35: resp = Chaves_35.values(); break; case 37: resp = Chaves_37.values(); break; default: break; } return resp; } }
4. 修改业务方法的循环变量类型
把循环里的Enum<?>改成ChaveCanal,就能直接调用接口里定义的方法了:
public static boolean VerificaChavesCanais_JSON(int codigoCanal) { if(codigoCanal <= 0) return false; JSONObject payloadJSON = new JSONObject("{\"1\":\"35\",\"8\":\"2021-06-29 14:33:41.121\",\"35\":\"Windows 10\",\"1234\":\"Computer\",\"3288\":\"PT-BR\",\"4423\":\"SIM\",\"7732\":\"64x\",\"7845\":\"PC_MAPS_01\"}"); try { // 修改变量类型为ChaveCanal for (ChaveCanal chaveId : ChavesCanal.BuscaChavesCanal(codigoCanal)) { if(!payloadJSON.has(chaveId.getCodigoAsString())) { System.out.println(" .... chave '" + chaveId.getCodigoAsString() + "' não encontrada!!!"); } } return true; } catch (Exception e) { System.out.println("ERRO em VerificaChavesCanais_JSON(): " + e.getMessage()); return false; } }
内容的提问来源于stack exchange,提问作者user8227026
相关产品推荐
相关产品推荐

