0
class root { public void say() { System.out.print("hello\n"); }}
class A extends root { @Override public void say() { System.out.print("world A\n"); }}
class B extends root { @Override public void say() { System.out.print("world B\n"); }}
//abstract class C extends <T> { public void go() { say(); say(); }}
class C <T extends root> { public void go() { say(); say(); }}

public class Template { public static void main(String[] args) {
    C c = new C<A>(); c.say();
    D d = new C<B>(); d.say();
}}

我需要将扩展​​ A 和 B 的 C 类。(在现实生活中,它们将是水平(A)和垂直(B)滚动视图)。但这不会编译。我浏览了几十个你可以在网上找到的例子,但是这两个例子都不是可编译的程序,它们只会让我越来越困惑。请帮忙!

4

2 回答 2

1

C类没有say方法,因此代码永远不会编译。另外,好像没有D课。

为了使它编译,C应该扩展root或者C应该有一个say方法。

有问题的代码行:

class C <T extends root> { public void go() { say(); say(); }}

C c = new C<A>(); c.say();

您可以将代码修改为此以使其运行:

class C <T extends root> {

    T element;

    public C(T element) { this.element = element; }

    public go() { element.say(); }
}

//...

C c = new C<A>(new A()); c.go();

Perception 的评论中所述,您应该查看 Oracle 提供的泛型教程以更好地理解此事。

于 2013-03-06T03:27:30.387 回答
0

当你说class C<T extends root>并不意味着Cextends root

这意味着这C是一个具有类型参数的类T,它扩展了root

这意味着一个C对象可以接受任何扩展的类作为类型参数root

是否C扩展root自身是完全不相关的。

要进行Cextend root,您只需使用以下命令:class C extends root

在您的示例中,类型参数的用途尚不清楚(即您从不使用 T)。

于 2013-03-06T03:30:56.770 回答