code: @Override
  	public Set<Pair<T, I>> keySet() {
  		return new AbstractSet<Pair<T, I>>() {
  			@Override
  			public boolean add(Pair<T, I> e) {
  				throw new UnsupportedOperationException();
  			}
  
  			@Override
  			public void clear() {
  				PairMap.this.clear();
  			}
  
  			@Override
  			public boolean contains(Object o) {
  				return keys.contains(o);
  			}
  
  			@Override
  			public boolean containsAll(Collection<?> c) {
  				return keys.containsAll(c);
  			}
  
  			@Override
  			public boolean isEmpty() {
  				return keys.isEmpty();
  			}
  
  			@Override
  			public Iterator<Pair<T, I>> iterator() {
  				return new Iterator<Pair<T,I>>() {
  					Iterator<Pair<T, I>> itr = keys.iterator();
  					@Override
  					public boolean hasNext() {
  						return itr.hasNext();
  					}
  
  					@Override
  					public Pair<T, I> next() {
  						return itr.next();
  					}
  
  					@Override
  					public void remove() {
  						throw new UnsupportedOperationException();
  					}
  				};
  			}
  
  			@Override
  			public boolean remove(Object o) {
  				throw new UnsupportedOperationException();
  			}
  
  			@Override
  			public int size() {
  				return keys.size();
  			}
  		};
  	}
docs: {@inheritDoc}