如何正确扩展这个抽象类?
How do I properly extend this abstract class?
嗨,我对 Java 没有经验。我了解继承的概念,但我认为语法在躲避我。我正在寻求一些帮助,让我开始扩展这个摘要 class:
我需要从中创建一个具体对象。
这个 class 应该做的是在初始化期间接受一个类型并存储该类型的对象列表。对它们进行排序,然后在调用 showTopN 时 return 列出 n 个顶级对象。
我还没有开始实现逻辑。
abstract class Foo<T extends Comparable<T>> {
int n;
Foo(int n){ // constructor; sets object property n
this.n = n;
}
abstract void push(T object); //object method to store a new object in the list
abstract List<T> showTopN(); // object method to return top n entries in the list, sorted.
}
我试过用这种方式将它扩展到一个具体的对象中:
class ConcreteFoo extends Foo {
private List<Foo> fooList;
public void push(Foo object) {
}
@Override
public List<Foo> showTopN() {
return fooList;
}
@Override
public int compareTo(ConcreteFoo other) {
return 0;
}
}
但是编译器抱怨我没有覆盖 push 方法。
怎么了?
push 方法指定它将接受一个 T
对象,这是 Foo
的泛型类型,您还没有声明。如果您希望 Foo
成为其自身的 List
,我不确定您是否这样做,则必须将其声明为
class ConcreteFoo extends Foo<Foo> {
但我认为你需要重新审视你的基本原则。
这里发生了两件事。一个是 Foo 的 "abstractness",另一个是泛型。你忽略了泛型方面。
如果您知道您的 Concrete foo 关心的对象类型,您可以直接使用它:
class ConcreteFoo extends Foo<SomeKnownClass> {
private List<SomeKnownClass> list = new ArrayList<SomeKnownClass>();
void push(SomeKnownClass skc) {}
List<SomeKnownClass> showTopN() { return list; }
}
现在,如果您不知道它的类型,您仍然可以使用泛型:
class ConcreteFoo<T extends Comparable<T>> extends Foo<T> {
private List<T> list = new ArrayList<T>();
void push(T skc) {}
List<T> showTopN() { return list; }
}
请注意,Foo
和 ConcreteFoo
都没有实现 Comparable,因此您不需要 compareTo
方法。
您将容器与其包含的对象混为一谈。您想要的 class 结构类似于:
class Foo implements Comparable<Foo> { ... }
abstract class GenericContainer<T> {
abstract void push(T object); //object method to store a new object in the list
abstract List<T> showTopN(); // object method to return top k entries in the list, sorted.
}
class FooContainer extends GenericContainer<Foo> {
private List<Foo> fooList;
...
}
您的 showTopN 方法可以是这样的:
public List<Foo> showTopN() {
return Collections.sort(fooList).subList(0, n);
}
嗨,我对 Java 没有经验。我了解继承的概念,但我认为语法在躲避我。我正在寻求一些帮助,让我开始扩展这个摘要 class: 我需要从中创建一个具体对象。
这个 class 应该做的是在初始化期间接受一个类型并存储该类型的对象列表。对它们进行排序,然后在调用 showTopN 时 return 列出 n 个顶级对象。
我还没有开始实现逻辑。
abstract class Foo<T extends Comparable<T>> {
int n;
Foo(int n){ // constructor; sets object property n
this.n = n;
}
abstract void push(T object); //object method to store a new object in the list
abstract List<T> showTopN(); // object method to return top n entries in the list, sorted.
}
我试过用这种方式将它扩展到一个具体的对象中:
class ConcreteFoo extends Foo {
private List<Foo> fooList;
public void push(Foo object) {
}
@Override
public List<Foo> showTopN() {
return fooList;
}
@Override
public int compareTo(ConcreteFoo other) {
return 0;
}
}
但是编译器抱怨我没有覆盖 push 方法。 怎么了?
push 方法指定它将接受一个 T
对象,这是 Foo
的泛型类型,您还没有声明。如果您希望 Foo
成为其自身的 List
,我不确定您是否这样做,则必须将其声明为
class ConcreteFoo extends Foo<Foo> {
但我认为你需要重新审视你的基本原则。
这里发生了两件事。一个是 Foo 的 "abstractness",另一个是泛型。你忽略了泛型方面。
如果您知道您的 Concrete foo 关心的对象类型,您可以直接使用它:
class ConcreteFoo extends Foo<SomeKnownClass> {
private List<SomeKnownClass> list = new ArrayList<SomeKnownClass>();
void push(SomeKnownClass skc) {}
List<SomeKnownClass> showTopN() { return list; }
}
现在,如果您不知道它的类型,您仍然可以使用泛型:
class ConcreteFoo<T extends Comparable<T>> extends Foo<T> {
private List<T> list = new ArrayList<T>();
void push(T skc) {}
List<T> showTopN() { return list; }
}
请注意,Foo
和 ConcreteFoo
都没有实现 Comparable,因此您不需要 compareTo
方法。
您将容器与其包含的对象混为一谈。您想要的 class 结构类似于:
class Foo implements Comparable<Foo> { ... }
abstract class GenericContainer<T> {
abstract void push(T object); //object method to store a new object in the list
abstract List<T> showTopN(); // object method to return top k entries in the list, sorted.
}
class FooContainer extends GenericContainer<Foo> {
private List<Foo> fooList;
...
}
您的 showTopN 方法可以是这样的:
public List<Foo> showTopN() {
return Collections.sort(fooList).subList(0, n);
}