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)のスクロールビューになります)。しかし、これはコンパイルされません。Web や SO で見つけることができる数十の例を参照しましたが、どちらの例もコンパイル可能なプログラムではなく、ますます混乱するだけです。助けてください!

4

2 に答える 2

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 のコメントに記載されているように、Oracle が提供するGenericsチュートリアルを確認して、問題をよりよく理解する必要があります。

于 2013-03-06T03:27:30.387 に答える
0

あなたが言うとき、それがextendsという意味でclass C<T extends root>はありませCroot

これは、が を拡張Cする型パラメータ を持つクラスであることを意味します。Troot

これは、Cオブジェクトが を拡張する任意のクラスを型パラメーターとして受け入れることができることを意味しますroot

それ自体がC拡張するかどうかはまったく関係ありません。root

C拡張するにrootは、次のようにします。class C extends root

あなたの例では、型パラメーターの目的が明確ではありません (つまり、T を使用することはありません)。

于 2013-03-06T03:30:56.770 に答える