0

私はいくつかのコードを読んでいて、なぜ以下が機能するのかを理解したいと思います:

これはStackクラスです。 public class Stack<Item> { ***** }

次に、mainメソッドで、クラスのインスタンスが作成されました。 Stack<String> s = new Stack<String>();

ItemGeneric Stackクラス宣言の正確な意味は何ですか?これは標準のJavaItemクラスですか、それともJavaジェネリックの命名規則ですか?コードが機能するためには、Stringこれがサブクラスである必要があると思いますよね?Item

4

2 に答える 2

2

public class Stack<Item>

Item正式なタイプのパラメーター名です。特定のJavaクラスに対応していないため、暗黙のパッケージ名はありません。

Stack<MyItem> stack = new Stack<MyItem>();

MyItemは型の実際のバインディングであるためItem、実際のクラスに対応する必要があり、暗黙のパッケージがあります。

「正式な」パラメータと「実際の」パラメータの違いはx42以下の違いと同じです。

int f(int x) { ... }   // x is a formal parameter name

System.out.println(f(42));   // 42 is the actual parameter to which the formal x is bound.
于 2013-03-26T03:47:44.520 に答える
1

Item標準のJavaクラスではないようです。任意のジェネリック型の場合もありますが、その場合は特定のString型を問題なく使用できます。

Stackクラスのこの実装を参照していますか?

http://algs4.cs.princeton.edu/13stacks/Stack.java.html

コードが機能するためには、StringがこのItemのサブクラスである必要があると思いますよね?

必ずしも。上記のコメントに記載されているJavaトレイルを確認してください。クラスを「スロットイン」し、ジェネリック型を使用してクラスまたはメソッド全体でそれを参照できるように、ジェネリックを定義することができます。

PS:ジェネリックはコンパイル時にのみ適用されることに注意してください。それらはバイトコードには存在しません。

于 2013-03-26T03:48:18.023 に答える