2017-02-11 15 views
0

ジェネリックスを使用して独自のリンクリストクラスをJavaで作成しようとしています。リンクリストは、私が作成した2つの異なるNodeクラスで動作するはずです。私は自分のリンクリストで使用されているノードクラスのメソッドを呼び出せるようにしたいが、明らかにそれをやろうとしている方法ではうまくいかない。各ノードクラスはすべて同じメソッド(およびメソッド名)を持ちますが、それぞれのメソッドは異なることを行います。これで私はいくつかの質問があります:ジェネリックスを使用してリンクリストを作成する方法

1)ジェネリック型変数の呼び出しメソッドに対する "回避策"(ある場合)とは何ですか?私の場合、私は自分のノードクラスのメソッドをリンクリストクラスから呼び出そうとしています。

2)私が定義した2つのノードクラスは、リンクリストに含めることができる唯一の2つのデータ型であることを確認するにはどうすればよいですか?

3)これについて完全に間違っていると思いますか?すなわち、私はこれを全く異なる方法で行うべきですか?

ここに、コードの簡略化されたバージョンがあります。

public class Node1 { 

    public int stuff1; 
    public Node1 nextNode; 

    Node1() { 
     this.nextNode = null; 
    } 

    public void doStuff(){ 
     System.out.println("Node 1 did stuff"); 
    } 

} 

public class Node2 { 

    public int stuff2; 
    public Node2 nextNode; 

    Node2() { 
     this.nextNode = null; 
    } 

    public void doStuff(){ 
     System.out.println("Node 2 did other stuff"); 
    } 

} 

public class LinkedList<T>{ 

    public T first; // do I need to construct/instantiate this too? 

    public void doStuff() { 
     first.doStuff; 
    } 

    public static void main(String[] args){ 
     LinkedList<Node1> node1 = new LinkedList<Node1>; 
     LinkedList<Node2> node2 = new LinkedList<Node2>; 
     node1.doStuff(); 
     node2.doStuff(); 
    } 

} 

ありがとうございます!あなたの具体的な例

+0

node1とnode2を共通の抽象クラスに拡張する必要があるので、 'T extends abstractClass'のようなものでそのクラスだけを受け入れることができます – nhouser9

+0

あなたの目的に合っていないと破棄します: 'Node'クラスの全てが必要な' Node'クラスであり、 'doStuff'メソッドは抽象クラスであり、具体的なサブクラスである' Node1'と 'Node2'では実装が異なります。あなたのリストクラスは 'public class LinkedList 'と宣言できます。 –

答えて

1

  1. CanDoStuff
  2. は、両方のクラスがインタフェース
  3. LinkedList<T extends CanDoStuff>

としてLinkedListクラスを定義して実装持っ例えばそれを呼び出す、doStuff()を指定interfaceを定義しますしかし、ジェネリックスを使用すると、要素および/またはLinkedList<Node2>のみを含む。リストの内容を2つのクラスのみに制限したい場合は、ジェネリックをまったく使用する必要はありません。あなたのLinkedLIstTを置き換えて、CanDoStuffを代用します(クラスを非総称にします)。

この場合、リストから要素を取得すると、CanDoStuffに戻ります。具体的なクラスのメソッドを呼び出すには、参照をダウンキャストする必要があります。メソッド宣言をCanDoStuffに変換し、Node1Node2の両方に実装します。

+0

"あなたのLinkedLIstにTがあるところで、CanDoStuffを代用してください(クラスを非genericにしてください)。"リンクされたリストクラスの最初の行をpublic class LinkedList {とし、他のすべての 'T'の使用をCanDoStuffに置き換えることを意味しますか? – zbalda

+0

はい、そうです。 –

関連する問題