如何退回不确定类型?

时间:2017-06-08 01:13:04

标签: java polymorphism

我有一个名为'Shape'的父类,并在其中编写一个方法 我希望任何类扩展它可以调用更大的方法供其​​他用途。 像这样简单的逻辑:

public abstract Class Shape{
    public int size;
    public Shape() {}
    public Class<? extends Shape> bigger() {
        this.size += 1;
        return this; // ← Here,How can I return it with unsure type?
    }
}

但我怎么能在这里找回一个不确定的类型? 谢谢你的任何想法!

====

如果我有一个类Square扩展Shape;

我希望像这样使用它:

Square S = new Square().bigger();

它会返回一个Shape Class,而不是Square Class。

但我不想使用:( Square)new Square.bigger();

我希望它可以自动识别使用此方法的类a

并返回正确的类型。

4 个答案:

答案 0 :(得分:3)

您可以覆盖返回bigger()(不是Square)的Shape方法。 它很豪华。

public abstract class Shape {
    public int size;
    public Shape() {}
    public Shape bigger() {
        this.size += 1;
        return this; // ← Here,How can I return it with unsure type?
    }
}

public class Square extends Shape {
    @Override
    public Square bigger() { // returns Square, not Shape
        return this;
    }
}

答案 1 :(得分:1)

你不能在这里返回Class,而只是Shape。像,

public abstract class Shape { // <- class
    public int size;

    public Shape() {
    }

    public Shape bigger() { // <-- a Shape. By definition of a sub-class because
        this.size += 1; // <-- "this" class is abstract
        return this;
    }
}

答案 2 :(得分:0)

我不确定&#34;不确定&#34;类型,但在java中我们有Generic类型,Java可以返回任何类,无论它们是什么。

例如

{{1}}

我希望你能理解我想说的话。

答案 3 :(得分:0)

在Java中,当您覆盖方法时,您实际上可能比接口所需的更具体。例如,界面需要更大的返回Shape,但是从Shape延伸的Square类可以返回Square,因为Square是一个Shape。这意味着如果您将其分配给Square变量,则在调用较大的变量时无需强制转换。

public abstract class Shape { // class not Class
    public int size;

    public Shape bigger() {
        this.size += 1;
        return this;
    }
}

public class Square extends Shape {
    @Override
    public Square bigger() {
        this.size += 1;
        return this;
    }
}

这是一种方法,在这种情况下有点令人沮丧,因为它重复了代码。另一种在C#中工作的方法是使用具有泛型类型实现本身的限制的泛型。这被称为奇怪的重复模板模式https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

public abstract class Shape <S extends Shape>{
    public int size;

    public S bigger() {
        this.size += 1;
        return this;
    }
}

public class Square extends Shape<Square>{
}