Tag: 多态性

如何创建多个子类级别,以便参数属于子类?

在这个StackOverFlow问题之后,让我们说我想扩展到另一个级别的子类,比如Mallards,我该怎么做? public abstract class Animal <A extends Animal> { public abstract A copyAnimal(A animal); } public class Duck extends Animal { @Override public Duck copyAnimal(Duck duck) { return copyOfDuck; } } class Mallard extends Duck { public Mallard copyAnimal(Mallard mallard) { return copyOfMallard; } } 一切都适用于Duck子类,但它对于Mallard子类来说是失败的。 如何使用未确定数量的子类进行设置?

在java中实现接口方法是否覆盖

我知道这可能很疯狂,但今天我的一位朋友在询问我们在java中实现接口时感到困惑的是它被视为方法覆盖。 我告诉他,当我们实现任何接口时,第一次提供方法的工作(定义)时,它不会重写。 为了支持多重inheritance,java提供了接口,但他并不相信并且在争论。 请介绍一下这个话题。

generics编程是多态的一个例子吗?

我正在做一个家庭作业(一个项目),其中一个标准是我必须以明显改善代码整体质量或function的方式利用多态性。 我做了一个哈希表,看起来像这样: public class HashTable{ … } Hashable是我制作的具有hash()函数的接口。 我知道使用generics这种方式可以提高代码的质量,因为现在HashTable几乎可以处理我想要的任何类型(例如,而不仅仅是整数或字符串)。 但我不确定它是否表现出多态性。 我认为确实如此,因为E可以是任何实现Hashable的类型。 换句话说,HashTable是一个可以(几乎)使用任何类型的类。 但我不太确定 – 这是多态吗? 也许我可以得到一些关于究竟多态性是什么的澄清? 提前致谢! 编辑:收到下面的答案后(见: 收到的第一个答案 ),我读了维基百科的文章,并发现了这个: “在面向对象的编程社区中,使用参数多态的编程通常称为generics编程 。” (重点补充)

通用构造函数的好处

为非generics类设置generics构造函数有什么好处? Java规范允许以下内容: class NonGeneric { NonGeneric() { } … NonGeneric ref = new NonGeneric(); } 能不能提出一个现实的例子来说明何时它可以增强class级的类型安全性? 它首先比使用Generic更好。 我知道Java设计者希望构造函数与方法更加一致。 鉴于构造函数可能有副作用,generics构造函数可以使用generics来改变一些不保留引用的参数,如 NonGeneric(T obj, List list) { list.add(obj); // Don’t hold a reference to list }

Java未选中覆盖返回类型

我有一个包含以下组件的项目: public abstract class BaseThing { public abstract ThingDoer getThingDoer(); } public class SomeThing extends BaseThing { public ThingDoer getThingDoer() { return Things.getSomeThingDoer(); } } public class SomeOtherThing extends BaseThing { public ThingDoer getThingDoer() { return Things.getSomeOtherThingDoer(); } } public class Things { public ThingDoer getSomeThingDoer { return getThingDoer(SomeThing.class); } public ThingDoer getSomeOtherThingDoer { return […]

为什么静态方法不涉及多态(后期绑定)我看到错误,静态方法不能被覆盖

请考虑以下代码: class A{ public static void m(Number n){ System.out.println(“Number A”); }; } class B extends A{ public static int m(Number n){ System.out.println(“Number B”); return 1; }; } 输出: java中的:inheritanceTest.B中的m(java.lang.Number)不能覆盖inheritanceTest中的m(java.lang.Number)。返回类型int与void不兼容 我知道静态方法不涉及多态,因此我推断我的代码不可能覆盖。 这个编译器消息对我来说很奇怪。 据我所知,重写是多态的一部分。 我准备scjp,我害怕在熟悉的问题上犯错误。 请澄清这个问题。 我的预期行为 – 有关重载错误的消息 P.S1。 我已经阅读了关于静态覆盖的热门问题,我没有找到答案( P.S2。 据Pshemo回答: 这段代码: class Foo{ public static void m(Number n){ System.out.println(“Number A”); }; public static int […]

为什么Java中的void不协变?

如果我有这个界面: public interface Foo { void bar(); } 为什么我不能这样实现呢? public class FooImpl implements Foo { @Override public Object bar() { return new Object(); } } 似乎无效应该与一切协变。 我错过了什么吗? 编辑:我应该更清楚我正在寻找设计理由,而不是它不会编译的技术原因。 对所有事物进行空洞协变是否会产生负面影响?

抽象类如何引用而不是对象?

请注意,您不能构造抽象类的对象,但仍可以使用类型为抽象类的对象引用。 当然,它引用的实际对象必须是具体子类的实例: Account anAccount; // OK anAccount = new Account(); // Error—Account is abstract anAccount = new SavingsAccount(); // OK anAccount = null; // OK 不明白为什么你可以有一个抽象类的对象引用…

GWT 2.4.0 RequestFactory多态性

GWT 2.4是否支持这种情况: @Entity class MyBase {…} @Entity class MyChild1 extends MyBase {…} @Entity class MyChild2 extends MyBase {…} … @ProxyFor(MyBase.class) class MyBaseProxy extends EntityProxy {…} @ProxyFor(MyChild1.class) class MyChild1Proxy extends MyBaseProxy {…} @ProxyFor(MyChild2.class) class MyChild2Proxy extends MyBaseProxy {…} … @Service(ArticleBase.class) public interface MyBaseRequest extends RequestContext { Request getStuff(); // MyChild1 here } … Request getStuffRequest = […]

inheritance,方法签名,方法重写和throws子句

我的Parent课是: import java.io.IOException; public class Parent { int x = 0; public int getX() throws IOException{ if(x<=0){ throw new IOException(); } return x; } } 我extend这个类来编写一个子类Child : public class Child1 extends Parent{ public int getX(){ return x+10; } } 请注意,在覆盖 Child类中的getX方法时,我已从方法定义中删除了throws子句。现在,它会导致编译器出现exception行为,这是预期的: new Parent().getX() ; 如果没有将其包含在try-catch块中,则无法编译。 new Child().getX() ; 编译时不将其封闭在try-catch块中。 但是下面的代码行需要try-catch块。 Parent p = new Child(); […]