diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
index a55124e..00221ae 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
@@ -57,24 +57,10 @@
     }
 
     /**
-     * The user of this methods must receive the return value as Double or double.
-     * Otherwise, this methods throws an exception.
-     *
-     * @param <T> type of the return value
-     * @return the volume of this resource
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> T volume() {
-        return (T) Double.valueOf(value);
-    }
-
-    /**
      * Returns the value of the resource amount.
      *
      * @return the value of the resource amount
      */
-    // FIXME: overlapping a purpose with volume()
     public double value() {
         return value;
     }
@@ -93,6 +79,24 @@
         return foundInAncestor || foundInLeaf;
     }
 
+    /**
+     * {@inheritDoc}
+     *
+     * A user must specify Double.class or double.class to avoid an empty value.
+     */
+    @Override
+    public <T> Optional<T> valueAs(Class<T> type) {
+        checkNotNull(type);
+
+        if (type == Object.class || type == double.class || type == Double.class) {
+            @SuppressWarnings("unchecked")
+            T value = (T) Double.valueOf(this.value);
+            return Optional.of(value);
+        }
+
+        return Optional.empty();
+    }
+
     @Override
     public Object last() {
         if (id.components().isEmpty()) {
@@ -138,7 +142,7 @@
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("id", id)
-                .add("volume", value)
+                .add("value", value)
                 .toString();
     }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
index 6ce51d3..beb564a 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
@@ -56,20 +56,6 @@
         return type.isAssignableFrom(id.components().get(id.components().size() - 1).getClass());
     }
 
-    /**
-     * The user of this methods must receive the return value as the correct type.
-     * Otherwise, this methods throws an exception.
-     *
-     * @param <T> type of the return value
-     * @return the volume of this resource
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    // TODO: consider receiving Class<T> as an argument. Which approach is convenient?
-    public <T> T volume() {
-        return (T) last();
-    }
-
     @Override
     public boolean isSubTypeOf(Class<?> ancestor) {
         checkNotNull(ancestor);
@@ -82,6 +68,19 @@
     }
 
     @Override
+    public <T> Optional<T> valueAs(Class<T> type) {
+        checkNotNull(type);
+
+        if (!isTypeOf(type)) {
+            return Optional.empty();
+        }
+
+        @SuppressWarnings("unchecked")
+        T value = (T) id.components().get(id.components().size() - 1);
+        return Optional.of(value);
+    }
+
+    @Override
     public Object last() {
         if (id.components().isEmpty()) {
             return null;
@@ -133,7 +132,6 @@
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("id", id)
-                .add("volume", volume())
                 .toString();
     }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
index f2a0c73..5572592 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
@@ -64,13 +64,15 @@
     boolean isSubTypeOf(Class<?> ancestor);
 
     /**
-     * Returns the volume of this resource.
+     * Returns value interpreted as the specified type. If the specified type is
+     * incompatible with the underlying value, an empty instance is returned.
      *
-     * @param <T> type of return value
-     * @return the volume of this resource
+     * @param type class instance specifying the type of return value
+     * @param <T> type of the return value
+     * @return the value of this resource as the specified type. If type mismatches,
+     * returns an empty instance.
      */
-    // TODO: think about other naming possibilities. amount? quantity?
-    <T> T volume();
+    <T> Optional<T> valueAs(Class<T> type);
 
     /**
      * Returns the last component of this instance.
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
index bc6fd29..b404d10 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
@@ -126,18 +126,25 @@
     }
 
     @Test
-    public void testVolumeOfDiscrete() {
+    public void testValueOfDiscrete() {
         Resource resource = Resources.discrete(D1).resource();
 
-        DeviceId volume = resource.volume();
-        assertThat(volume, is(D1));
+        Optional<DeviceId> volume = resource.valueAs(DeviceId.class);
+        assertThat(volume.get(), is(D1));
     }
 
     @Test
-    public void testVolumeOfContinuous() {
+    public void testValueOfRoot() {
+        Resource resource = Resource.ROOT;
+
+        assertThat(resource.valueAs(Object.class), is(Optional.empty()));
+    }
+
+    @Test
+    public void testValueOfContinuous() {
         Resource resource = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
 
-        double volume = resource.volume();
-        assertThat(volume, is(BW1.bps()));
+        Optional<Double> volume = resource.valueAs(double.class);
+        assertThat(volume.get(), is(BW1.bps()));
     }
 }
