私はジェネリッククラスでプログラミングを練習しています。ジェネリック型のオブジェクトへの参照と次のリスト要素への参照を保持するリスト要素のクラスを実装したいと思います。
だから私はこのクラスを思いついた:
class List<T>{
T val;
List next:
}
このクラスのコンストラクターをどのように定義しますか?ジェネリッククラスとその使用法を理解するための他のアドバイスはありますか?
私はジェネリッククラスでプログラミングを練習しています。ジェネリック型のオブジェクトへの参照と次のリスト要素への参照を保持するリスト要素のクラスを実装したいと思います。
だから私はこのクラスを思いついた:
class List<T>{
T val;
List next:
}
このクラスのコンストラクターをどのように定義しますか?ジェネリッククラスとその使用法を理解するための他のアドバイスはありますか?
デフォルトのコンストラクターのままにして、それを使用でき List<String> list = new List<String>();
ます。これで、クラスのvalはStringになります。別の方法:
public class List<T>{
T val;
List<T> next;
public List(T val, List<T> next) {
this.val = val;
this.next = next;
};
public T getVal() {
return val;
}
}
そして、あなたはそれをこのように使うことができます:
List<String> strList = new List<String>("test", null);
System.out.println( strList.getVal() );
結果として「テスト」を印刷する必要があります
アドバイスとしては、この本を読むのが一番だと思います。JavaGenerics and Collections には、優れた説明と使用方法の例がたくさん含まれています。
これは、ジェネリック医薬品の頭を悩ませるのに役立つ優れたリソースです。
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
LinkedListを見て、何をしようとしているのかを確認すると役立つ場合があります。
Javadoc:http ://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html ソースとJava APIドキュメントの両方をここからダウンロードできます:http ://www.oracle.com/ technetwork / java / javase / downloads / index.html
ソースを調べて、JavaのGenericsで実際にどのように実装されているかを確認できます。
一見すると、「head」要素と「tail」リストを持つLISPスタイルのコレクションをもっと探していると思いました。いくつかのコードを一緒に投げることは私にこれを与えました:
package generic.list;
import java.util.List;
public class GenericList<T>
{
private T head;
private GenericList<T> tail;
public GenericList(List<T> initialList)
{
if ( !initialList.isEmpty() )
{
head = initialList.get(0);
if ( initialList.size() > 1 )
{
tail = new GenericList<T>(initialList.subList(1, initialList.size()));
}
}
}
public T getHead()
{
return head;
}
public GenericList<T> getTail()
{
return tail;
}
}
この種の構造は、再帰的アルゴリズムの非常に優れた調査につながる可能性がありますが、ジェネリックスを学習しようとしているときは、それほど多くのことを行うことはできません。そうは言っても、これが実際に機能することを確認するために私が書いた簡単なテストベッドは次のとおりです。
package generic.list;
import static org.junit.Assert.*;
import java.util.Arrays;
import org.junit.Test;
public class GenericListTest
{
private GenericList l;
@Test
public void testConstructorNoElements()
{
l = new GenericList(Arrays.asList(new String[] {}));
assertNull(l.getHead());
assertNull(l.getTail());
}
@Test
public void testConstructorOneElement()
{
l = new GenericList(Arrays.asList("One"));
assertNotNull(l.getHead());
assertEquals("One", l.getHead());
assertNull(l.getTail());
}
@Test
public void testConstructorMultipleElements()
{
l = new GenericList(Arrays.asList("One", "Two", "Three"));
assertNotNull(l.getHead());
assertEquals("One", l.getHead());
assertNotNull(l.getTail());
assertEquals(l.getTail().getHead(), "Two");
assertEquals(l.getTail().getTail().getHead(), "Three");
assertNull(l.getTail().getTail().getTail());
}
}
これにより、少なくとも、ジェネリッククラスをインスタンス化して利用する方法についてより良いアイデアが得られるはずです。
オンラインレッスンはhttp://download.oracle.com/javase/tutorial/java/generics/index.htmlにあります。
ジェネリックスについて理解する最大のことは、クラスの名前に「T」をリストすると(「GenericList」のように)、Tがこのクラスのスコープのクラスになるということです。GenericListの外部のクラスは、Tが何であるかを知りません。また、GenericListは、Tが何であるかさえ実際には知りません。知っているのは、Tが表示されるすべての場所で、他の場所のTと同じタイプになるということだけです。したがって、GenericListは、何が格納されているかを必ずしも認識していませんが、「ヘッド」(T)のタイプが、initialListを介して渡されるオブジェクトと同じタイプであることを認識しています。