2011-01-18 13 views
2

java apiは同じ名前の複数のジェネリックと非ジェネリックを定義しています(LinkedListなど)。同じステートメントimport java.util.LinkedList;を使用して解決されます。しかし、1つのパッケージでは、(同じ名前の).javaファイルには1つのパブリッククラスしか存在しないことがあります。同じ名前のジェネリックで非ジェネリック

同じ効果が得られますか?コメントがなければ

package org.****.ai.ass1.part1; 
import java.util.LinkedList; 

public abstract class Test extends LinkedList { } 
//public abstract class Test<E> extends LinkedList<E> { } 

、私は次のエラーを取得:私は、次のコードを試してみましたThe type Test is already definedを。しかし、私が他の人にコメントすると、両方の行がコンパイルされます。では、Java APIはどのように機能しますか?

答えて

4

により、Javaがジェネリック(型消去のためのGoogleの)を実装する方法に、LinkedList<T>LinkedListはまったく同じタイプを表します。同じ完全修飾名で2つの異なる型を宣言する方法はありません。

+0

コンパイラの警告に注意を払わないときは、非ジェネリッククラスのようなジェネリッククラスのインスタンスを使うことができます。 – Ralph

+0

@Ralph:それは私には分かりません。これは同じ実装で、同じクラスです。いくつかの制限がありますが、インスタンスを非ジェネリック型からジェネリック型にキャストすることもできます(その逆も可能ですが、わかりません)。 –

+0

thats私が意味すること:ジェネリッククラスは同じです。具体的なジェネリック型に関する情報は、そのインスタンス(インスタンス)を使用するときに「配置」されます。このジェネリック情報を「入れない」場合は、ジェネリッククラスがない場合と同様にジェネリッククラスを使用します。 - とにかく:これはあなたの答えに対する批判ではありませんでした(正しいので) - この質問に関してジェネリックスがどのように機能するかをもう少し説明したいだけです。 – Ralph

0

あなたは、このようなクラスを定義した場合:

package x; 

public class Clazz<T> { 

} 

をあなたにもジェネリックと非ジェネリッククラスとしてそれを使用することができます。

public class X extends x.Clazz { 
} 

public class Y extends x.Clazz<String> { 
} 
0

あなたは両方を見ているので、それはおそらくですジェネリックスが追加された1.5以前のクラスのJava API、および同じAPI 1.5以降が含まれています。

,List 1.5のように、java.util.Listがあります。

あなたが言ったように、2番目のものにジェネリック型パラメータがある以外は、同じ名前を共有します。

Java 1.5、またはJava 5では、List、Iterator、HashMapなどのコレクションクラスの多くを書き換えて、ジェネリック型パラメータを組み込みました。したがって、コアJavaライブラリには2つのバージョンの1つのクラスがなく、コンパイル時にジェネリックスが提供する型の安全性を利用するために書き直しただけです。

しかし、タイプ消去のおかげで、リストのジェネリックバージョンは、下位互換性の目的で、のように通常のバージョンのリストと同じようにです。 List<String>は、Listのようになります。

関連する問題