code: @SuppressWarnings("unchecked")
      @Nullable
      public <T> T getUnique(final URI property, final Class<T> valueClass)
              throws IllegalStateException, IllegalArgumentException {
          final Object result;
          synchronized (this) {
              result = doGet(property, valueClass);
          }
          if (result == null) {
              return null;
          } else if (result instanceof List<?>) {
              final List<T> list = (List<T>) result;
              final StringBuilder builder = new StringBuilder("Expected one value for property ")
                      .append(property).append(", found ").append(list.size()).append(" values: ");
              for (int i = 0; i < Math.min(3, list.size()); ++i) {
                  builder.append(i > 0 ? ", " : "").append(list.get(i));
              }
              builder.append(list.size() > 3 ? ", ..." : "");
              throw new IllegalStateException(builder.toString());
          } else {
              return (T) result;
          }
      }
docs: Returns the unique value of the property converted to an instance of a certain class, or
  null if the property has no value. Note that this method fails if the property has multiple
  values or its unique value cannot be converted to the requested class; if this is not the
  desired behavior, use {@link #getUnique(URI, Class, Object)} supplying an appropriate
  default value to be returned in case of failure.
  
  @param property
  the property to read
  @param valueClass
  the class to convert the value to
  @param <T>
  the type of result
  @return the unique value of the property, converted to the class specified; null if the
  property has no value
  @throws IllegalStateException
  in case the property has multiple values
  @throws IllegalArgumentException
  in case the unique property value cannot be converted to the class specified