【问题标题】:Java 'T extends' 'hello-world' won't compileJava 'T extends' 'hello-world' 不会编译
【发布时间】:2013-03-06 03:26:36
【问题描述】:
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)滚动视图)。但这不会编译。我浏览了几十个你可以在网上找到的例子,但是这两个例子都不是可编译的程序,它们只会让我越来越困惑。请帮忙!

【问题讨论】:

  • 我意识到这很难解释我想要在这里实现的目标。但这是我最初的问题,用户 moxn 建议使用这样的泛型。但我显然弄错了(或没有弄错)。 stackoverflow.com/questions/15222285/…
  • 在继续这个项目之前,我强烈建议您通读Oracle Tutorial on Java Generics。这是一本快速阅读的书,也是您了解泛型如何工作以及如何在代码中使用它们的不错起点。
  • 另外,Java(与 C++ 不同)不支持一个类的多个父级。你得到 1 且只有 1 个。

标签: java generics


【解决方案1】:

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

为了使其编译,C 应该扩展 rootC 应该有一个 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's comment 中所述,您应该查看Oracle 提供的Generics 教程以更好地了解此事。

【讨论】:

    【解决方案2】:

    当您说class C&lt;T extends root&gt; 时,它确实意味着C 扩展root

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

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

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

    要使C 扩展root,您只需使用:class C extends root

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多