我尝试根据传递给构造函数的参数的本机类型动态扩展对象。
我已经阅读了一些java泛型和通配符,但我似乎无法找到一个好方法。
伪代码解释:
public class myClass extends <?> {
// Constructor
public myClass(<?> param) {
}
}
我是否必须使用某种类型的构建器类?如果是这样,我将如何解决这个问题?
修改
我有一种感觉,我的方法非常糟糕,因此我在这里问。进一步解释:
我有一个带有许多子接口的接口,其中一些子接口也有子接口。出于我的目的,我无法编辑超级界面来添加方法,因为它是一个API。我有一个事件,它传递给我一个子接口,我希望能够转换为我自己的对象,它有更多的方法和属性,但我仍然想要访问子接口的方法。
例如,子接口称为实体。我可以做myClass extendedEntity = new myClass(entity)
,它有我想要公开的新方法。如果我将传递的子接口作为对象的属性,我可以extendedEntity.entity.originalMethod()
来访问子接口中包含的方法。但我希望将其设为extendedEntity.originalMethod()
以及extendedEntity.addedMethod()
。
这对任何人都有意义吗?有什么明显的我可以做的,我错过了吗? (作为一名机械工程师,java是一种爱好,请原谅我!)
答案 0 :(得分:1)
泛型不是为了扩展课程。用于指定类处理给定的类(或类集)。例如,List<String>
是List
,用于存储String
,而不是Object
。
仿制药仅在编制时使用。即使您要求的内容得到支持,在运行时也会以
结尾 public class myClass extends Object {
public myClass(Object param) {
}
}
答案 1 :(得分:1)
为什么不调查委托模式,而不是担心泛型?您的extendedEntity可以实现Entity
,将传入的entity
存储在私有字段中,并将所有Entity
方法调用委托给它。它可以在自己的界面上拥有您想要的任何额外方法。
我不确定你是否完全理解铸造是如何工作的。它并没有神奇地将一个物体变成另一个物体。仅当A a = (A) b
已类型b
(或子类型)时,广告A
才有效。
答案 2 :(得分:0)
在运行时编译代码似乎是合理的解决这个问题。我也曾经听过BCEL,你也可以看一下。