2011-01-17 13 views
1

私はジェネリッククラスでプログラミングを練習しています。私はジェネリック型のオブジェクトの参照と次のリスト要素の参照を保持するリスト要素のクラスを実装したいと思います。リスト要素の汎用クラス

だから私は、このクラスを思い付いた:

class List<T>{ 
    T val; 
    List next: 
} 

どのようにこのクラスのコンストラクタを定義するのでしょうか?ジェネリッククラスとその使用法を理解するためのその他のアドバイスはありますか?

+3

本当にあなたの質問に対する答えではなく、あなたのコードのための提案です。あなたの意図した通りにコードを動作させるには、 'List next; 'にする必要があります。 – biziclop

+0

私はこのクラスはジェネリッククラスを学ぶのにはとても良いとは思いません。私はあなたが自分のArrayListやHashMapを作成する方が良いと思う。なぜなら、これらのクラスは遺伝学の理解をはるかに微妙に理解する必要があるからだ。 – templatetypedef

答えて

3

あなたはデフォルトのコンストラクタでそれを残すことができます。use itList<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()); 

、私は最高のものが読みだと思いますこの本:Java Generics and Collections それはそれを使用する方法の良い説明と多くの例が含まれています。

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

2

これは、あなたの頭のラウンドのジェネリックを取得助けるための素晴らしいリソースです。

の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でジェネリックに実装されているか確認できるようになります。

1

それは多分役に立つあなたが何をしようとしてのためのLinkedListを見てのために:

1

一見したところで、あなたは "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と同じ型になります。そのため、GenericListは格納する内容を必ずしも把握していませんが、 "head"(T)の型はinitialList経由で渡されるオブジェクトと同じ型であることがわかります。

関連する問題