どのような状況でジェネリックスを使うべきか理解したい。Iterableを実装したLinkedListでGenericを使用する
iterableであるLinkedListを実装したいとします。
実装1:
public class LinkedList<E>{
private Node head;
private class Node{
private Node next;
private E e;
}
}
私の最初の質問:明らかに、LinkedListのは一般的なものの型パラメータを持つべきノードも持つべき型パラメータEを?
実装2:
public class LinkedList<E>{
private Node<E> head;
private class Node<E>{
private Node<E> next;
private E e;
}
}
両方の実装が微細コンパイルすなわち、上記のコードは次のように書かれるべきです。私は私の教科書に実装1を見ました。したがって、実装2は少し不必要なようです。
次に、Iterableを実装したいと思います。我々が実装1に固執すると仮定し、我々が持っているでしょう:
実装3:
public class LinkedList<E> implements Iterable<E>{
private Node head;
private class Node{
private Node next;
private E e;
}
public Iterator<E> iterator(){
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator<E>{
private Node curr;
public boolean hasNext(){
return curr != null;
}
public E next(){
E element = curr.e;
curr = curr.next;
return element;
}
}
これは私が教科書で見てきた実装の標準一種です。
私の2番目の質問:ノードにジェネリック型がないため、イテレータとイテレータにジェネリック型を使用できないのはなぜですか?例えば:
実装4:
public class LinkedList1<E> implements Iterable{
private Node head;
private class Node{
private Node next;
private E e;
}
public Iterator iterator(){
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator{
private Node curr = head;
public boolean hasNext(){
return curr != null;
}
public E next(){
E element = curr.e;
curr = curr.next;
return element;
}
}
}
「NodeはLinkedListの一部です」という意味は理解できません。 NodeとLinkedListIteratorはLinkedList の内部クラスですが、Iterableはそうではありません。私はNodeがどのように暗黙的に汎用的であるかはかなり分かりません。たとえば、LinkedList.javaのmainメソッドで、 "LinkedList ls = new LinkedList ();(文字列をlsに入れます); String str = ls.head.e;"が存在するとします。 「互換性のない型:ObjectをStringに変換できないため」コンパイル時エラー。 –
Student