我有一个名为'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
并返回正确的类型。
答案 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>{
}