Tag: inheritance

仅允许父工厂方法实例化子类

我毫不怀疑这已被问到并在这里回答了十几次,但我找不到满意的答案。 我有一个类的系列,我只想通过像这样的静态方法实例化抽象父类(我可能在这里打字错误,我在打字而不试图编译)。 public abstract class Papa { public static Papa newInstance() { String strClass = Papa.figureOutTheNameOfChildClassToInstantiate(); Papa papa = (Papa) Class.forName(strClass).newInstance(); return papa; } public abstract void doSomething(); … } public class Child extends Papa { public void doSomething() { /* Do something */ } } 这或多或少是我现在所拥有的。 我想做的是确保Child只能通过工厂方法Papa.newInstance()实例化。 我试图通过将Child的无参数构造函数设为私有来做到这一点,但是后来Papa无法实例化它。 所以,我的问题是,如何确保子实例仅由工厂方法Papa.newInstance()创建?

Java类inheritance,私有字段可以在子类中访问,为什么?

我的代码非常类似于以下内容。 package my.pkg; public abstract class X { private CapableField field; public abstract void doSomething(); public X(CapableField fieldValue) { this.field = fieldValue; } } 和: package my.pkg.sub; public class Y extends my.pkg.X { public void doSomething() { this.field.doSomething(); } } 为什么这个甚至是Java中的合法代码? 我认为“私有”意味着该字段不能在子类中直接访问,并且这是类inheritance的一个相当基本的原则。 使X具体而不是抽象不会改变任何东西。 如果我特别希望字段或成员函数只能在定义它的类中访问,而不是在定义类的某个随机子类中,我该怎么办?

为什么我不能扩展接口“generics方法”并将其类型缩小到我inheritance的接口“class generic”?

我展示了一个我的意思的例子,哪个更容易。 想象一下,generics类型C表示颜色类型:因此,为了直观简化,假设C是C扩展颜色 interface Screen { Background render(Plane plane); } interface MonochromeScreen extends Screen{ @Override Background render(Plane plane); } 这将引发名称冲突编译错误,说明两者都具有相同类型的擦除但不可覆盖。 但我无法理解为什么我们不能简单地允许覆盖签名,只要它更具限制性。 我的意思是,毕竟,唯一的区别是generics类型的范围,在Screen中是方法范围的,而MonochromeScreen是在类范围内。 允许子方法在其父级在类级别强制执行时允许子方法作为方法范围的generics覆盖是没有意义的,但我认为它不这样做:我的父接口可以有20个方法与不相关的generics类型,但我的子类将强制它们全部与非不兼容的额外规格/合同相同(这是任何扩展接口所做的),毕竟,单色屏幕仍然是一个屏幕,因为它可以涂上任何颜色,我只是强制执行该颜色,无论哪个颜色,都与孩子的其他function保持一致,只是缩小了课堂级别的可能性,而不是方法级别。 考虑这个function有没有根本错误的假设? 编辑:我接受了Sotirios Delimanolis的回答,因为他非常聪明地发现了正确的麻烦而且我没有要求解决方案,但是对于那些想要知道如何克服这种情况的人来说,有一个技巧在我自己的答案中解释

Java设置实例的超级实例

我可能只是无法谷歌正确的单词,但我找不到以下问题的答案。 是否可以显式设置新类实例的超类。 例如,我有一个SuperClazz实例,想要创建一个新的SuperClazz实例,它扩展了SuperClazz 。 我可以做这样的事情(代码就是我想要做的,它不能编译,也不正确): class Clazz extends SuperClazz{ Clazz(SuperClazz superInstance){ this.super = superInstance; } }

Java中接口实现的inheritance

我有两个关于Java接口的问题。 1)如果一个类碰巧实现了接口I的所有接口方法,而没有声明自己实现它们,它仍然可以用作I类变量的输入吗? 2)实现接口I的A类的子类是否inheritance了该接口的一致性,还是应该声明自己实现I?

使用上边界通配符时不兼容的类型

我真的很困惑上界类型在Javagenerics中是如何工作的。 比方说我有 interface IModel interface I class A implements I class B implements I class C implements I 那么我有一个带参数的方法如下 foo(IModel<Map<? extends I, Map<? extends I, List>>> dataModel) 调用那个方法就像 IModel<Map<A, Map<B, List>>> model = … foo(model) 以编译错误结束 Error:(112, 49) java: incompatible types: IModel<java.util.Map<A,java.util.Map<B,java.util.List>>> cannot be converted to IModel<java.util.Map<? extends I,java.util.Map<? extends I,java.util.List>>> 我已经从Oracle网络上阅读了关于Javagenerics的文档,试图谷歌它,但必须有一些我完全被误解的东西。

了解Java中的inheritance和抽象类

好吧所以我通过googleing寻找文档,但是我没有找到任何真正描述我想要回答的内容,所以我在这里问你们。 所以我得到了inheritance,以及它是如何工作的。 我遇到问题的有时候我看到一个最初定义为一种类型的对象,并设置为不同的类型,我不明白究竟发生了什么。 这是一个例子: 说我有一个类动物,并且类猫和狗延伸动物。 猫,动物和狗都有方法说(),对于猫打印“喵”和狗打印“woof”和动物“不能说话”。 好吧,所以最后这是我的问题。 如果制作一只猫(c)然后运行Animal a = c,究竟会发生什么? 如果我运行a.speak()会发生什么? 哪种说法叫做? 当我改变那样的类型时究竟发生了什么? 我有没有真正的理由使用它? 就抽象方法而言,我的问题是拥有它们究竟是什么意思? 在示例中,我已经看到它们已被放入超类中,并且其下的类定义了确切的行为。 通过在超类中放置一个抽象方法,需要它下面的所有类来实现它吗? 感谢你的帮助!

如何直接调用JAXB XMLAdapter

当我试图直接解组根对象而不是另一个对象中的字段时,我违反了jaxb的XMLAdapters的限制,因此绕过了@XmlJavaTypeAdapter 我宁愿不包装我的对象,因为这将改变将在我们的数据库中序列化的xml。 听起来有可能直接调用XMLAdapter,在其他地方通过这些答案: [1] http://www.coderanch.com/t/505457/XML/jaxb-xmladapter-rootElement [2] http://markmail.org/message/etvbyzn3e3idpa7q#query:+page:1+mid:cetzvq37nifr6tk6+ state:results [3] JaxBinheritance编组抽象类 但我不知道你会怎么做:( 我猜它会是这样的 AdaptedFoo adaptedFoo = (new MyAdapter()).unmarshall(fooXml) 但这不是XMLAdapter unmarshal方法的接口。 在我的情况下,xml需要转换为AdaptedFoo对象才能被解组。 eg. public BackgroundJob unmarshal(AdaptedFoo adaptedFoo) 我是否需要一个额外的解组步骤来将myXml转换为AdaptedFoo对象,然后调用我的XMLAdapter将其转换为预期的子类? 还是有更优雅的方式? 什么是推荐的过程?

从inheritance的受保护Java字段创建公共访问器

我该如何进行以下工作: class Foo extends javax.swing.undo.UndoManager { // increase visibility – works for method override def editToBeUndone: javax.swing.undo.UndoableEdit = super.editToBeUndone // fails for field def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits } 请注意, edits是CompoundEdit ( UndoManager的超类)中的受保护字段。 我想要一个具有相同名称的公共访问器来读取该字段。 我该怎么办? :8: error: super may be not be used on variable edits def edits: java.util.Vector[javax.swing.undo.UndoableEdit] = super.edits ^

使用简单XML框架inheritance

我正在使用Simple XML Framework来解析XML文件。 从服务器我收到XML-File,如下所示: 我有一个接口(或超类) 对象和两个子类A和B. 是否可以反序列化此XML-Document? 我在教程中看到有可能用类 -attribute来区分子类 ,但不幸的是,这对我来说是不可能的。 有没有办法选择框架在type属性的基础上选择正确的子类? 我不能使用另一个框架(如JAXB)因为我使用Android ..