Tag: 多态

对java中多态概念的困惑

我对java中的多态概念感到有点困惑,因为不同的作者以不同的方式编写它。 情况1 动态(运行时)多态 – 使用实例方法的方法重载和方法重写是动态多态的示例。 静态(编译时)多态性—使用静态方法进行方法重载和方法重写; 使用私有或最终方法重写的方法是静态多态的示例 案例2 方法重载是编译时/静态多态的一个例子 方法覆盖是运行时/动态多态的一个例子 那么哪种情况是正确的??? 和java支持静态或动态多态?

发送Object类型的对象而不是String – Polymorphism

我有一个现有的方法,如下所示: public void parseMessage(String message){ … … … } 并通过调用它来调用该方法,如下所示 String message; parseMessage(message); 我需要修改它以处理新类型的消息。 从parseMessage方法调用的新类型消息的解析器在解析消息之前首先需要一些属性。 我在想做的是将消息作为一个看起来像这样的对象传递 public class MessageObject{ private String message; private String namespace; private String xmlVersion; } 然后我可以将现有方法称为 Object messageObject; parseMessage(messageObject); 然后,我可以通过将其作为(MessageObject)messageObject进行转换来使用它。 这是正确的做法,还是有更好的方法。 做上述事情有危险吗? PS。 我必须使用上面的转换方法作为im使用JDK1.4 谢谢 更新 我无法修改parseMessage方法。 它内部有一个调用,它为每个相关的解析器调用parse()方法。 public void parseMessage(String message){ … … parser.parse(message) } 上面显示的解析器引用是实现接口“Parser”的对象。 我正在介绍的新解析器遵循这种结构,它还实现了“Parser”接口。 唯一的修改(即对MessageObject的转换)在新的解析器中。 我无法更改现有的parseMethod,因为这将需要更改实现“Parser”接口的所有现有解析器。 我想避免根据消息类型调用特定的解析器。 […]

Iterator接口方法在哪里有hasNext(),next(),remove()定义? 因为接口永远不会定义方法只声明

Iterator接口方法在哪里定义了hasNext(),next(),remove()等? 接口不定义方法,只声明在其他类中定义的方法。 我们如何通过Iterator引用直接访问hasnext(),next()等方法? 例如: List l = new LinkedList(); l.add(1); l.add(2); Iterator iter = l.iterator(); while(iter.hasNext()) { Object o = iter.next(); System.out.println(o); } 在上面的示例中,使用引用iter(Iterator引用)可以在iter引用中分配任何方法吗? 请给我一个代码示例。 直到现在我才能理解这个概念。

为什么我不能扩展接口“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的回答,因为他非常聪明地发现了正确的麻烦而且我没有要求解决方案,但是对于那些想要知道如何克服这种情况的人来说,有一个技巧在我自己的答案中解释

在使用generics(Java)的扩展接口中覆盖方法契约?

我试图覆盖扩展另一个接口的接口中的方法声明。 这两个接口都使用generics。 根据Java教程,这应该是可能的,但该示例不使用generics。 当我尝试实现它时,编译器显示以下错误(我已经替换了名称,因为某些代码不是我自己的。): InterfaceExtended中的myMethod(T)与Interface中的myMethod(T)冲突; 两种方法都有相同的擦除,但都不会覆盖另一种方法。 代码如下所示: public interface Interface { public void myMethod(T x); } public interface ExtendedInterface extends Interface { public void myMethod(T x); } 如果有人建议如何改变它以使其可接受,或解释这是导致问题的原因,我将非常感激。 谢谢! badPanda

更改子类java中的类变量类型

我有一个名为“模块”的课程 public abstract class Module { protected Map ports; … public Map getPorts() { return ports; } } 以及一个名为Design的类,它是Module的子类 public class Design extends Module{ … //want to do this but doesn’t compile @override public Map getPorts() { return (Map) ports; //TopPort is a subclass of Port } } 基本上我想要做的只是将TopPorts添加到Design中,并且在从getPorts()函数返回时已经转换了类型。 我现在正在做的是在getPorts函数返回main之后将Ports转换为TopPorts,但这非常有问题,并且正在构建我的代码的人无法立即了解何时返回TopPort。 我也试过创建另一个函数而不是重写getPorts() //want to do this […]

使用Java进行转换(接口和类)

如果: interface I{} class A implements I{} class B extends A{} class C extends B{} A a = new A(); B b = new B(); Why a = (B)(I)b; is correct but b = (B)(I)a; is false? 我发现施法很混乱,如果我可以向下施放或向上施放物体,最好的方法是什么?

Hibernate多态查询

我有两个类,Person和Company,来自另一个类Contact。 它们在两个表(Person和Company)中以多态forms表示。 简化的类看起来像这样: public abstract class Contact { Integer id; public abstract String getDisplayName(); } public class Person extends Contact { String firstName; String lastName; public String getDisplayName() { return firstName + ” ” + lastName; } } public class Company extends Contact { String name; public String getDisplayName() { return name; } } 问题是我需要查询查找包含某个字符串的displayName的所有联系人。 […]

子类型多态性和数组

Computer[] labComputers = new Computer[10]; 同 public class Computer { … void toString(){ // print computer specs } } public class Notebook extends Computer{ … void toString(){ // print computer specs + laptop color } } 每个下标变量labComputers[i]可以引用Computer对象或Notebook对象,因为Notebook是Computer的子类。 对于调用labComputers[i].toString() ,多态性可确保调用正确的toString方法。 我想知道如果我们做了什么 Notebook[] labComputers = new Notebook[10]; 如果我使用Computer对象和Notebook对象引用,我会得到什么样的类型或错误

与Java混淆覆盖访问级别

可能重复: 为什么不能降低java子类中方法的可见性? 为什么我可以在子类中使用public覆盖超类中的private方法,但是我不能将超类中的public方法重写为子类中的private方法? 为什么? 先谢谢你。