Java重载问题:调用setDefaultValues提示Cannot resolve method报错
问题根因
- 直接报错原因是参数类型不匹配:你定义的
setDefaultValues重载方法接收的是StringSchema/IntegerSchema**实例**,但你调用时传入的是schema.getClass()返回的Class<? extends Schema>`元对象,二者类型完全不匹配,编译器自然找不到对应的方法。 - 就算你把入参改成
schema实例,重载仍然不会生效:Java的方法重载是编译期静态分派,只会根据参数的静态类型选择目标方法,defineSchemaAndValues方法中schema的静态类型是Schema<T>,编译器无法感知它运行时的实际子类类型,还是会报找不到匹配方法的错误。
解决方案
下面给出三种常用的修复方案,可根据你的业务场景选择:
方案1:instanceof强制类型转换(适合子类数量少、后续很少扩展的场景)
代码最简单,直接在调用前判断实例类型,强转后调用对应重载方法:
private <T> void defineSchemaAndValues(Schema<T> schema) { if (schema instanceof StringSchema) { setDefaultValues((StringSchema) schema); } else if (schema instanceof IntegerSchema) { setDefaultValues((IntegerSchema) schema); } // 其他Schema子类按规则补充判断即可 } private void setDefaultValues(StringSchema schema) { schema.setMaxLength(100); } private void setDefaultValues(IntegerSchema schema) { schema.setMaxLength(200); }
方案2:模式匹配switch(Java 17+ 可用,代码更简洁)
如果你的项目使用Java 17及以上版本,可以用模式匹配switch简化类型判断逻辑:
private <T> void defineSchemaAndValues(Schema<T> schema) { switch (schema) { case StringSchema stringSchema -> setDefaultValues(stringSchema); case IntegerSchema integerSchema -> setDefaultValues(integerSchema); default -> {} // 非目标类型的处理逻辑可自行补充 } }
方案3:访问者模式(适合子类多、后续频繁扩展的场景,符合开闭原则)
如果Schema子类后续还会持续新增,推荐用访问者模式实现动态分派,避免每次加子类都要修改大量判断逻辑:
- 定义访问者接口,为每个Schema子类声明对应的处理方法
public interface SchemaVisitor { void visit(StringSchema schema); void visit(IntegerSchema schema); // 新增Schema子类时只需要在这里加对应visit方法即可 }
- 在Schema父类中新增抽象accept方法
public abstract class Schema<T> { public abstract void accept(SchemaVisitor visitor); }
- 每个子类实现accept方法,调用访问者的对应处理逻辑
public class StringSchema extends Schema<String> { @Override public void accept(SchemaVisitor visitor) { visitor.visit(this); } } public class IntegerSchema extends Schema<Integer> { @Override public void accept(SchemaVisitor visitor) { visitor.visit(this); } }
- 业务代码调用时传入访问者实现即可
private <T> void defineSchemaAndValues(Schema<T> schema) { schema.accept(new SchemaVisitor() { @Override public void visit(StringSchema schema) { schema.setMaxLength(100); } @Override public void visit(IntegerSchema schema) { schema.setMaxLength(200); } }); }
内容的提问来源于stack exchange,提问作者Fedya Savchuk
相关产品推荐
相关产品推荐

