java在客户端代码中使用类型处理多个类
假设我有以下的课程
class A {}
class B {}
abstract class ParentClass<T> {
abstract void accept(T t);
}
class Child1 extends ParentClass<A> {
void accept(A a) {}
}
class Child2 extends ParentClass<B> {
void accept(B b) {}
}
现在,如果我有一个客户端代码,我想让child1和child2的实例都映射到映射中的字符串(并且)还使用accept方法,这似乎是不可能的,我明白了原因。有更好的工作吗
我的客户端代码看起来像
class Client {
Map<String, ParentClass<?>> map = new HashMap<>();
public Client() {
map.put("C1", new Child1());
map.put("C2", new Child2());
}
void callAccept(String type, Object o) {
map.get(type).accept(o); //error
}
}
#更新1 在示例中添加返回类型,因为我在mobile中键入问题时遗漏了返回类型
# 1 楼答案
“更好”取决于你想要实现什么。我理解你的问题,你只是想编译代码并理解它。很多变化都是可能的,“最佳”取决于您所解决的业务问题
如果没有代码可能解决的业务问题,下面是编译时不会出错的代码。我修复了代码中的几个错误:
ParentClass
是一个容器,子类为Child1
和Child2
上面的
Base
是ParentClass
子类中包含的有效负载的基类。您需要有效负载的基类,因为容器类(ParentClass
)是子类的,并且您希望能够混合和匹配有效负载Java、Scala、Haskell和其他语言使用type theory,特别是category theory精确定义什么是允许的。实际上,在不迷失数学的前提下,上面的一般指导原则是处理泛型的一些考虑因素
有关更多信息,请阅读Joshua Bloch的“有效Java”中关于通用容器的部分。我不相信他提到范畴理论,这是好的
如果你对“刚好够”类型理论感兴趣,请阅读covariant types