code: public boolean writeListBegin(int length, String type)
          throws IOException
      {
          flushIfFull();
  
          if (length < 0) {
              if (type != null) {
                  _buffer[_offset++] = (byte) BC_LIST_VARIABLE;
                  writeType(type);
              }
              else
                  _buffer[_offset++] = (byte) BC_LIST_VARIABLE_UNTYPED;
  
              return true;
          }
          else if (length <= LIST_DIRECT_MAX) {
              if (type != null) {
                  _buffer[_offset++] = (byte) (BC_LIST_DIRECT + length);
                  writeType(type);
              }
              else {
                  _buffer[_offset++] = (byte) (BC_LIST_DIRECT_UNTYPED + length);
              }
  
              return false;
          }
          else {
              if (type != null) {
                  _buffer[_offset++] = (byte) BC_LIST_FIXED;
                  writeType(type);
              }
              else {
                  _buffer[_offset++] = (byte) BC_LIST_FIXED_UNTYPED;
              }
  
              writeInt(length);
  
              return false;
          }
      }
docs: Writes the list header to the stream.  List writers will call
  <code>writeListBegin</code> followed by the list contents and then
  call <code>writeListEnd</code>.
  
  <code><pre>
  list ::= V type value* Z
  ::= v type int value*
  </pre></code>
  
  @return true for variable lists, false for fixed lists