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();
}}我需要类C将扩展A和B。(在现实生活中,它们将是水平(A)和垂直(B)滚动视图)。但这不会编译。我浏览了几十个你可以在网上找到的例子,但是没有一个例子是可编译的程序,它们只会让我越来越困惑。请帮帮我!
发布于 2013-03-06 11:27:30
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();正如Oracle中所述,您应该查看Perception's comment提供的Generics教程,以便更好地理解这个问题。
发布于 2013-03-06 11:30:57
当您说class C<T extends root>时,它不是而是,意思是C扩展了root。
这意味着C是一个带有类型参数T的类,它扩展了root。
这意味着C对象可以接受任何扩展root的类作为类型参数。
C是否扩展root本身是完全无关的。
要使C扩展root,只需使用以下命令:class C extends root
在您的示例中,type参数的用途并不明确(即您从不使用T)。
https://stackoverflow.com/questions/15238418
复制相似问题