如何创建可按需充当classA或classB的通用classC类?
问题分析与解决方案
你尝试的三种方式存在以下问题:
- 使用Object:
Object类没有value成员变量,直接访问commonClass.value会编译报错。 - 多继承:Java是单继承语言,一个类无法同时继承两个类,
classC extends classA, classB属于语法错误。 - ArrayList:集合类和“通用类适配ClassA/ClassB”的需求不匹配,无法实现预期逻辑。
下面给出两种可行的解决方案:
方案一:公共接口实现(推荐,符合面向对象设计)
定义一个统一接口,让ClassA和ClassB实现该接口,ClassC通过接口引用实现通用调用。
// 定义统一接口,约定getValue行为 interface ValueHolder { int getValue(); } public class ClassA implements ValueHolder { @Override public int getValue() { return 1; } } public class ClassB implements ValueHolder { @Override public int getValue() { return 2; } } public class ClassC { private ValueHolder target; // 适配ClassA的构造方法 public ClassC(ClassA a) { this.target = a; } // 适配ClassB的构造方法 public ClassC(ClassB b) { this.target = b; } public int getValue() { return target.getValue(); } } public class Main { public static void main(String args[]) { ClassC c1 = new ClassC(new ClassA()); ClassC c2 = new ClassC(new ClassB()); System.out.println(c1.getValue()); // 输出1 System.out.println(c2.getValue()); // 输出2 } }
优势:扩展性强,后续新增类似类时,只需实现ValueHolder接口即可,无需修改ClassC代码。
方案二:泛型+类型判断(无需修改原有ClassA/ClassB)
如果无法修改ClassA和ClassB的代码,可以用泛型存储实例,通过类型转换获取value:
public class ClassA { int value = 1; } public class ClassB { int value = 2; } public class ClassC<T> { private T target; public ClassC(T target) { this.target = target; } public int getValue() { if (target instanceof ClassA) { return ((ClassA) target).value; } else if (target instanceof ClassB) { return ((ClassB) target).value; } throw new IllegalArgumentException("不支持的目标类型"); } } public class Main { public static void main(String args[]) { ClassC<ClassA> c1 = new ClassC<>(new ClassA()); ClassC<ClassB> c2 = new ClassC<>(new ClassB()); System.out.println(c1.getValue()); // 输出1 System.out.println(c2.getValue()); // 输出2 } }
注意:新增适配类时需要修改getValue方法的判断逻辑,扩展性较弱。
另外补充你的原有代码的几个语法问题:
- Java类名规范为首字母大写(如
classA改为ClassA); - 构造方法名必须与类名一致,你代码中的
classB(classB b)是错误的,应改为ClassC(ClassB b); - 创建实例时需加括号:
new ClassA()而非new classA。
内容的提问来源于stack exchange,提问作者Kamalesh P
相关产品推荐
相关产品推荐

