title: Linked List get method using recursive method
body: <p>I was trying to design a get method for a linked list.
  It takes an int position as an argument and it returns the list element at the given position(position starts at zero).</p>
  
  <p>I think my logic is right, but doesn't compile. Could anyone point out what I have done wrong in here?</p>
  
  <pre><code>abstract public class AbstractListNode {
  
      abstract public Object first ( );
      abstract public AbstractListNode rest ( );
      abstract public boolean isEmpty ( );
      abstract public int size( );
      abstract public Object get(int index);
      // Every other list-processing method goes here.
  }
  
  class NonemptyListNode extends AbstractListNode {
  
      private Object myFirst;
      private AbstractListNode myRest;
  
      // cons in Scheme.
      public NonemptyListNode (Object first, AbstractListNode rest) {
          myFirst = first;
          if (rest == null) {
          myRest = new EmptyListNode ( );
          } else {
          myRest = rest;
          }
      }
  
      public NonemptyListNode (Object first) {
          this (first, new EmptyListNode ( ));
      }
  
      // car in Scheme.
      public Object first ( ) {
          return myFirst;
      }
  
      // cdr in Scheme.
      public AbstractListNode rest ( ) {
          return myRest;
      }
  
      public boolean isEmpty ( ) {
      return false;
      }
  
      public int size ( ) {
          return 1+myRest.size();
      }
  
      public Object get(int index){
          if(index+1 &gt; this.size())
              throw new IllegalArgumentException ("Out of Range");
          else if(index == 0){
              return myFirst;
          }
          else{
              index = index-1;
              AbstractListNode l = this.myRest;
              l.get(index);
          }          
      }
  }
  
  class EmptyListNode extends AbstractListNode {
  
      public EmptyListNode ( ) {
  
      }
  
      public Object first ( ) {
          throw new IllegalArgumentException ("There is no 'first' value stored in an EmptyListNode.");
      }
  
      public AbstractListNode rest ( ) {
          throw new IllegalArgumentException ("No elements follow an EmptyListNode.");
      }
  
      public boolean isEmpty ( ) {
          return true;
      }
  
      public int size( ) {
          return 0;
      }
  
      public Object get(int index){
          throw new IllegalArgumentException ("Out of Range");
      }
  }
  </code></pre>