Improve internal cast
[mdsal.git] / binding / yang-binding / src / main / java / org / opendaylight / yangtools / yang / binding / InstanceIdentifier.java
index 626aaf043ae23a92d3851a5df51fc06e34a41db7..416ce36b3d132f2f9664ace6cb0293579ecc9b53 100644 (file)
@@ -25,9 +25,7 @@ import java.util.Objects;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.Builder;
-import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.concepts.Path;
+import org.opendaylight.yangtools.concepts.HierarchicalIdentifier;
 import org.opendaylight.yangtools.util.HashCodeBuilder;
 
 /**
@@ -61,8 +59,8 @@ import org.opendaylight.yangtools.util.HashCodeBuilder;
  * <p>
  * This would be the same as using a path like so, "/nodes/node/openflow:1" to refer to the openflow:1 node
  */
-public class InstanceIdentifier<T extends DataObject> implements Path<InstanceIdentifier<? extends DataObject>>,
-        Immutable, Serializable {
+public class InstanceIdentifier<T extends DataObject>
+        implements HierarchicalIdentifier<InstanceIdentifier<? extends DataObject>> {
     private static final long serialVersionUID = 3L;
 
     /*
@@ -101,7 +99,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @throws NullPointerException if {@code target} is null
      */
     @SuppressWarnings("unchecked")
-    public final <N extends DataObject> @NonNull InstanceIdentifier<N> verifyTarget(final Class<N> target) {
+    public final <N extends DataObject> @NonNull InstanceIdentifier<N> verifyTarget(final Class<@NonNull N> target) {
         verify(target.equals(targetType), "Cannot adapt %s to %s", this, target);
         return (InstanceIdentifier<N>) this;
     }
@@ -217,7 +215,8 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return trimmed instance identifier, or null if the component type
      *         is not present.
      */
-    public final <I extends DataObject> @Nullable InstanceIdentifier<I> firstIdentifierOf(final Class<I> type) {
+    public final <I extends DataObject> @Nullable InstanceIdentifier<I> firstIdentifierOf(
+            final Class<@NonNull I> type) {
         int count = 1;
         for (final PathArgument a : pathArguments) {
             if (type.equals(a.getType())) {
@@ -242,7 +241,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      *         is not present.
      */
     public final <N extends Identifiable<K> & DataObject, K extends Identifier<N>> @Nullable K firstKeyOf(
-            final Class<N> listItem) {
+            final Class<@NonNull N> listItem) {
         for (final PathArgument i : pathArguments) {
             if (listItem.equals(i.getType())) {
                 @SuppressWarnings("unchecked")
@@ -341,7 +340,8 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return An InstanceIdentifier.
      * @throws NullPointerException if {@code container} is null
      */
-    public final <N extends ChildOf<? super T>> @NonNull InstanceIdentifier<N> child(final Class<N> container) {
+    public final <N extends ChildOf<? super T>> @NonNull InstanceIdentifier<N> child(
+            final Class<@NonNull N> container) {
         return childIdentifier(Item.of(container));
     }
 
@@ -358,7 +358,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      */
     @SuppressWarnings("unchecked")
     public final <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
-            @NonNull KeyedInstanceIdentifier<N, K> child(final Class<N> listItem, final K listKey) {
+            @NonNull KeyedInstanceIdentifier<N, K> child(final Class<@NonNull N> listItem, final K listKey) {
         return (KeyedInstanceIdentifier<N, K>) childIdentifier(IdentifiableItem.of(listItem, listKey));
     }
 
@@ -373,8 +373,9 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return An InstanceIdentifier.
      * @throws NullPointerException if any argument is null
      */
+    // FIXME: add a proper caller
     public final <C extends ChoiceIn<? super T> & DataObject, N extends ChildOf<? super C>>
-            @NonNull InstanceIdentifier<N> child(final Class<C> caze, final Class<N> container) {
+            @NonNull InstanceIdentifier<N> child(final Class<@NonNull C> caze, final Class<@NonNull N> container) {
         return childIdentifier(Item.of(caze, container));
     }
 
@@ -391,10 +392,11 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return An InstanceIdentifier.
      * @throws NullPointerException if any argument is null
      */
+    // FIXME: add a proper caller
     @SuppressWarnings("unchecked")
     public final <C extends ChoiceIn<? super T> & DataObject, K extends Identifier<N>,
         N extends Identifiable<K> & ChildOf<? super C>> @NonNull KeyedInstanceIdentifier<N, K> child(
-                final Class<C> caze, final Class<N> listItem, final K listKey) {
+                final Class<@NonNull C> caze, final Class<@NonNull N> listItem, final K listKey) {
         return (KeyedInstanceIdentifier<N, K>) childIdentifier(IdentifiableItem.of(caze, listItem, listKey));
     }
 
@@ -408,7 +410,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @throws NullPointerException if {@code container} is null
      */
     public final <N extends DataObject & Augmentation<? super T>> @NonNull InstanceIdentifier<N> augmentation(
-            final Class<N> container) {
+            final Class<@NonNull N> container) {
         return childIdentifier(Item.of(container));
     }
 
@@ -535,9 +537,9 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      *         contains a null element.
      */
     public static @NonNull InstanceIdentifier<?> create(final Iterable<? extends PathArgument> pathArguments) {
-        if (pathArguments instanceof ImmutableCollection<?>) {
+        if (pathArguments instanceof ImmutableCollection) {
             @SuppressWarnings("unchecked")
-            final Iterable<PathArgument> immutableArguments = (Iterable<PathArgument>) pathArguments;
+            final var immutableArguments = (ImmutableCollection<PathArgument>) pathArguments;
             return internalCreate(immutableArguments);
         }
 
@@ -558,7 +560,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
      * @return InstanceIdentifier instance
      */
     @SuppressWarnings("unchecked")
-    public static <T extends DataObject> @NonNull InstanceIdentifier<T> create(final Class<T> type) {
+    public static <T extends DataObject> @NonNull InstanceIdentifier<T> create(final Class<@NonNull T> type) {
         return (InstanceIdentifier<T>) create(ImmutableList.of(Item.of(type)));
     }
 
@@ -824,7 +826,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
         }
     }
 
-    public interface InstanceIdentifierBuilder<T extends DataObject> extends Builder<InstanceIdentifier<T>> {
+    public interface InstanceIdentifierBuilder<T extends DataObject> {
         /**
          * Append the specified container as a child of the current InstanceIdentifier referenced by the builder. This
          * method should be used when you want to build an instance identifier by appending top-level elements, for
@@ -872,7 +874,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
          * @throws NullPointerException if any argument is null
          */
         <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>>
-                @NonNull InstanceIdentifierBuilder<N> child(Class<N> listItem, K listKey);
+                @NonNull InstanceIdentifierBuilder<N> child(Class<@NonNull N> listItem, K listKey);
 
         /**
          * Append the specified listItem as a child of the current InstanceIdentifier referenced by the builder. This
@@ -909,8 +911,7 @@ public class InstanceIdentifier<T extends DataObject> implements Path<InstanceId
          *
          * @return Resulting instance identifier.
          */
-        @Override
-        InstanceIdentifier<T> build();
+        @NonNull InstanceIdentifier<T> build();
     }
 
     private Object writeReplace() throws ObjectStreamException {