Merge "Track generics in API definition."
diff --git a/api/current.txt b/api/current.txt
index 7b8930c..0b56c1d 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2921,11 +2921,11 @@
     field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
   }
 
-  public abstract interface AccountManagerCallback {
+  public abstract interface AccountManagerCallback<V> {
     method public abstract void run(android.accounts.AccountManagerFuture<V>);
   }
 
-  public abstract interface AccountManagerFuture {
+  public abstract interface AccountManagerFuture<V> {
     method public abstract boolean cancel(boolean);
     method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
     method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
@@ -3071,7 +3071,7 @@
     method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);
   }
 
-  public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter {
+  public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter {
     ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>);
     method public abstract T convertBack(V);
     method public android.animation.BidirectionalTypeConverter<V, T> invert();
@@ -3163,26 +3163,26 @@
     method public java.lang.String getPropertyName();
     method public java.lang.Object getTarget();
     method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
-    method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
+    method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
     method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...);
     method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
-    method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
+    method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
+    method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...);
     method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
-    method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
+    method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
+    method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]);
     method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
+    method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
     method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]);
     method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
+    method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
     method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
     method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+    method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
     method public void setAutoCancel(boolean);
     method public void setProperty(android.util.Property);
@@ -3206,17 +3206,17 @@
     method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
     method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+    method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
     method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+    method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
     method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+    method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
+    method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
     method public void setConverter(android.animation.TypeConverter);
     method public void setEvaluator(android.animation.TypeEvaluator);
     method public void setFloatValues(float...);
@@ -3253,12 +3253,12 @@
     method public abstract float getInterpolation(float);
   }
 
-  public abstract class TypeConverter {
+  public abstract class TypeConverter<T, V> {
     ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>);
     method public abstract V convert(T);
   }
 
-  public abstract interface TypeEvaluator {
+  public abstract interface TypeEvaluator<T> {
     method public abstract T evaluate(float, T, T);
   }
 
@@ -4588,7 +4588,7 @@
     method public android.os.Parcelable saveAllState();
   }
 
-  public abstract class FragmentHostCallback extends android.app.FragmentContainer {
+  public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer {
     ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
     method public void onAttachFragment(android.app.Fragment);
     method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
@@ -4855,12 +4855,12 @@
     method public abstract void destroyLoader(int);
     method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
     method public static void enableDebugLogging(boolean);
-    method public abstract android.content.Loader<D> getLoader(int);
-    method public abstract android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.content.Loader<D> getLoader(int);
+    method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
   }
 
-  public static abstract interface LoaderManager.LoaderCallbacks {
+  public static abstract interface LoaderManager.LoaderCallbacks<D> {
     method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle);
     method public abstract void onLoadFinished(android.content.Loader<D>, D);
     method public abstract void onLoaderReset(android.content.Loader<D>);
@@ -7677,7 +7677,7 @@
     ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper);
   }
 
-  public abstract class AsyncTaskLoader extends android.content.Loader {
+  public abstract class AsyncTaskLoader<D> extends android.content.Loader {
     ctor public AsyncTaskLoader(android.content.Context);
     method public void cancelLoadInBackground();
     method public boolean isLoadInBackgroundCanceled();
@@ -7859,7 +7859,7 @@
     method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
     method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
-    method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
+    method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
@@ -7872,7 +7872,7 @@
     method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
   }
 
-  public static abstract interface ContentProvider.PipeDataWriter {
+  public static abstract interface ContentProvider.PipeDataWriter<T> {
     method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T);
   }
 
@@ -8143,7 +8143,7 @@
     method public final java.lang.String getString(int);
     method public final java.lang.String getString(int, java.lang.Object...);
     method public abstract java.lang.Object getSystemService(java.lang.String);
-    method public final T getSystemService(java.lang.Class<T>);
+    method public final <T> T getSystemService(java.lang.Class<T>);
     method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>);
     method public final java.lang.CharSequence getText(int);
     method public abstract android.content.res.Resources.Theme getTheme();
@@ -8498,8 +8498,8 @@
     method public long getLongExtra(java.lang.String, long);
     method public java.lang.String getPackage();
     method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
-    method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
-    method public T getParcelableExtra(java.lang.String);
+    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
+    method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String);
     method public java.lang.String getScheme();
     method public android.content.Intent getSelector();
     method public java.io.Serializable getSerializableExtra(java.lang.String);
@@ -8974,7 +8974,7 @@
     ctor public IntentSender.SendIntentException(java.lang.Exception);
   }
 
-  public class Loader {
+  public class Loader<D> {
     ctor public Loader(android.content.Context);
     method public void abandon();
     method public boolean cancelLoad();
@@ -9011,11 +9011,11 @@
     ctor public Loader.ForceLoadContentObserver();
   }
 
-  public static abstract interface Loader.OnLoadCanceledListener {
+  public static abstract interface Loader.OnLoadCanceledListener<D> {
     method public abstract void onLoadCanceled(android.content.Loader<D>);
   }
 
-  public static abstract interface Loader.OnLoadCompleteListener {
+  public static abstract interface Loader.OnLoadCompleteListener<D> {
     method public abstract void onLoadComplete(android.content.Loader<D>, D);
   }
 
@@ -10887,7 +10887,7 @@
     method public boolean isNull(int);
   }
 
-  public abstract class Observable {
+  public abstract class Observable<T> {
     ctor public Observable();
     method public void registerObserver(T);
     method public void unregisterAll();
@@ -12778,7 +12778,7 @@
   public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable {
     ctor public AnimatedStateListDrawable();
     method public void addState(int[], android.graphics.drawable.Drawable, int);
-    method public void addTransition(int, int, T, boolean);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
   }
 
   public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 {
@@ -13903,7 +13903,7 @@
   }
 
   public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata {
-    method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
+    method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
     method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
     method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
     field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
@@ -13988,7 +13988,7 @@
     field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS;
   }
 
-  public static final class CameraCharacteristics.Key {
+  public static final class CameraCharacteristics.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
@@ -14053,7 +14053,7 @@
     method public void onTorchModeUnavailable(java.lang.String);
   }
 
-  public abstract class CameraMetadata {
+  public abstract class CameraMetadata<TKey> {
     method public java.util.List<TKey> getKeys();
     field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1
     field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2
@@ -14261,7 +14261,7 @@
 
   public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
     method public int describeContents();
-    method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
     method public java.lang.Object getTag();
     method public boolean isReprocess();
     method public void writeToParcel(android.os.Parcel, int);
@@ -14324,20 +14324,20 @@
   public static final class CaptureRequest.Builder {
     method public void addTarget(android.view.Surface);
     method public android.hardware.camera2.CaptureRequest build();
-    method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
     method public void removeTarget(android.view.Surface);
-    method public void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
+    method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
     method public void setTag(java.lang.Object);
   }
 
-  public static final class CaptureRequest.Key {
+  public static final class CaptureRequest.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
   }
 
   public class CaptureResult extends android.hardware.camera2.CameraMetadata {
-    method public T get(android.hardware.camera2.CaptureResult.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
     method public long getFrameNumber();
     method public android.hardware.camera2.CaptureRequest getRequest();
     method public int getSequenceId();
@@ -14418,7 +14418,7 @@
     field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
   }
 
-  public static final class CaptureResult.Key {
+  public static final class CaptureResult.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
@@ -14545,14 +14545,14 @@
     method public android.util.Size[] getInputSizes(int);
     method public final int[] getOutputFormats();
     method public long getOutputMinFrameDuration(int, android.util.Size);
-    method public long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
-    method public android.util.Size[] getOutputSizes(java.lang.Class<T>);
+    method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
+    method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>);
     method public android.util.Size[] getOutputSizes(int);
     method public long getOutputStallDuration(int, android.util.Size);
-    method public long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
+    method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
     method public final int[] getValidOutputFormatsForInput(int);
     method public boolean isOutputSupportedFor(int);
-    method public static boolean isOutputSupportedFor(java.lang.Class<T>);
+    method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>);
     method public boolean isOutputSupportedFor(android.view.Surface);
   }
 
@@ -16253,7 +16253,7 @@
 
 package android.icu.text {
 
-  public final class AlphabeticIndex implements java.lang.Iterable {
+  public final class AlphabeticIndex<V> implements java.lang.Iterable {
     ctor public AlphabeticIndex(android.icu.util.ULocale);
     ctor public AlphabeticIndex(java.util.Locale);
     ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator);
@@ -16279,7 +16279,7 @@
     method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String);
   }
 
-  public static class AlphabeticIndex.Bucket implements java.lang.Iterable {
+  public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable {
     method public java.lang.String getLabel();
     method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType();
     method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator();
@@ -16295,14 +16295,14 @@
     enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW;
   }
 
-  public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable {
+  public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable {
     method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int);
     method public int getBucketCount();
     method public int getBucketIndex(java.lang.CharSequence);
     method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
   }
 
-  public static class AlphabeticIndex.Record {
+  public static class AlphabeticIndex.Record<V> {
     method public V getData();
     method public java.lang.CharSequence getName();
   }
@@ -17815,8 +17815,8 @@
     method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet);
     method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>);
-    method public android.icu.text.UnicodeSet addAll(T...);
-    method public T addAllTo(T);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...);
+    method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T);
     method public void addMatchSetTo(android.icu.text.UnicodeSet);
     method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int);
     method public final android.icu.text.UnicodeSet applyPattern(java.lang.String);
@@ -17844,15 +17844,15 @@
     method public final boolean contains(java.lang.CharSequence);
     method public boolean containsAll(android.icu.text.UnicodeSet);
     method public boolean containsAll(java.lang.String);
-    method public boolean containsAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>);
     method public boolean containsNone(int, int);
     method public boolean containsNone(android.icu.text.UnicodeSet);
     method public boolean containsNone(java.lang.CharSequence);
-    method public boolean containsNone(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>);
     method public final boolean containsSome(int, int);
     method public final boolean containsSome(android.icu.text.UnicodeSet);
     method public final boolean containsSome(java.lang.CharSequence);
-    method public final boolean containsSome(java.lang.Iterable<T>);
+    method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>);
     method public android.icu.text.UnicodeSet freeze();
     method public static android.icu.text.UnicodeSet from(java.lang.CharSequence);
     method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence);
@@ -17870,14 +17870,14 @@
     method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence);
     method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet);
-    method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
     method public final android.icu.text.UnicodeSet removeAllStrings();
     method public android.icu.text.UnicodeSet retain(int, int);
     method public final android.icu.text.UnicodeSet retain(int);
     method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence);
     method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet);
-    method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
     method public android.icu.text.UnicodeSet set(int, int);
     method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet);
     method public int size();
@@ -18287,7 +18287,7 @@
     method public long getToDate();
   }
 
-  public abstract interface Freezable implements java.lang.Cloneable {
+  public abstract interface Freezable<T> implements java.lang.Cloneable {
     method public abstract T cloneAsThawed();
     method public abstract T freeze();
     method public abstract boolean isFrozen();
@@ -18569,7 +18569,7 @@
     field public static final android.icu.util.TimeUnit YEAR;
   }
 
-  public class Output {
+  public class Output<T> {
     ctor public Output();
     ctor public Output(T);
     field public T value;
@@ -28264,7 +28264,7 @@
 
 package android.os {
 
-  public abstract class AsyncTask {
+  public abstract class AsyncTask<Params, Progress, Result> {
     ctor public AsyncTask();
     method public final boolean cancel(boolean);
     method protected abstract Result doInBackground(Params...);
@@ -28493,16 +28493,16 @@
     method public float getFloat(java.lang.String, float);
     method public float[] getFloatArray(java.lang.String);
     method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String);
-    method public T getParcelable(java.lang.String);
+    method public <T extends android.os.Parcelable> T getParcelable(java.lang.String);
     method public android.os.Parcelable[] getParcelableArray(java.lang.String);
-    method public java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
+    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
     method public java.io.Serializable getSerializable(java.lang.String);
     method public short getShort(java.lang.String);
     method public short getShort(java.lang.String, short);
     method public short[] getShortArray(java.lang.String);
     method public android.util.Size getSize(java.lang.String);
     method public android.util.SizeF getSizeF(java.lang.String);
-    method public android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
+    method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
     method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
     method public boolean hasFileDescriptors();
     method public void putAll(android.os.Bundle);
@@ -29007,8 +29007,8 @@
     method public final long[] createLongArray();
     method public final java.lang.String[] createStringArray();
     method public final java.util.ArrayList<java.lang.String> createStringArrayList();
-    method public final T[] createTypedArray(android.os.Parcelable.Creator<T>);
-    method public final java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
+    method public final <T> T[] createTypedArray(android.os.Parcelable.Creator<T>);
+    method public final <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
     method public final int dataAvail();
     method public final int dataCapacity();
     method public final int dataPosition();
@@ -29041,7 +29041,7 @@
     method public final long readLong();
     method public final void readLongArray(long[]);
     method public final void readMap(java.util.Map, java.lang.ClassLoader);
-    method public final T readParcelable(java.lang.ClassLoader);
+    method public final <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader);
     method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
     method public final android.os.PersistableBundle readPersistableBundle();
     method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
@@ -29054,9 +29054,9 @@
     method public final void readStringArray(java.lang.String[]);
     method public final void readStringList(java.util.List<java.lang.String>);
     method public final android.os.IBinder readStrongBinder();
-    method public final void readTypedArray(T[], android.os.Parcelable.Creator<T>);
-    method public final void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
-    method public final T readTypedObject(android.os.Parcelable.Creator<T>);
+    method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
+    method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
+    method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>);
     method public final java.lang.Object readValue(java.lang.ClassLoader);
     method public final void recycle();
     method public final void setDataCapacity(int);
@@ -29087,7 +29087,7 @@
     method public final void writeMap(java.util.Map);
     method public final void writeNoException();
     method public final void writeParcelable(android.os.Parcelable, int);
-    method public final void writeParcelableArray(T[], int);
+    method public final <T extends android.os.Parcelable> void writeParcelableArray(T[], int);
     method public final void writePersistableBundle(android.os.PersistableBundle);
     method public final void writeSerializable(java.io.Serializable);
     method public final void writeSize(android.util.Size);
@@ -29099,9 +29099,9 @@
     method public final void writeStringList(java.util.List<java.lang.String>);
     method public final void writeStrongBinder(android.os.IBinder);
     method public final void writeStrongInterface(android.os.IInterface);
-    method public final void writeTypedArray(T[], int);
-    method public final void writeTypedList(java.util.List<T>);
-    method public final void writeTypedObject(T, int);
+    method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int);
+    method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
+    method public final <T extends android.os.Parcelable> void writeTypedObject(T, int);
     method public final void writeValue(java.lang.Object);
     field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
   }
@@ -29179,11 +29179,11 @@
     field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
   }
 
-  public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator {
+  public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator {
     method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
   }
 
-  public static abstract interface Parcelable.Creator {
+  public static abstract interface Parcelable.Creator<T> {
     method public abstract T createFromParcel(android.os.Parcel);
     method public abstract T[] newArray(int);
   }
@@ -29298,7 +29298,7 @@
     method public abstract void onProgress(int);
   }
 
-  public class RemoteCallbackList {
+  public class RemoteCallbackList<E extends android.os.IInterface> {
     ctor public RemoteCallbackList();
     method public int beginBroadcast();
     method public void finishBroadcast();
@@ -34625,7 +34625,7 @@
     field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService";
   }
 
-  public static abstract interface CarrierMessagingService.ResultCallback {
+  public static abstract interface CarrierMessagingService.ResultCallback<T> {
     method public abstract void onReceiveResult(T) throws android.os.RemoteException;
   }
 
@@ -34777,7 +34777,7 @@
     field public static final java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
   }
 
-  public class MediaBrowserService.Result {
+  public class MediaBrowserService.Result<T> {
     method public void detach();
     method public void sendResult(T);
   }
@@ -37705,14 +37705,14 @@
 
 package android.test {
 
-  public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>);
     ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean);
     method public T getActivity();
     method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
   }
 
-  public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>);
     ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>);
     method public T getActivity();
@@ -37727,7 +37727,7 @@
     method protected void setActivity(android.app.Activity);
   }
 
-  public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public ActivityUnitTestCase(java.lang.Class<T>);
     method public T getActivity();
     method public int getFinishedActivityRequest();
@@ -37773,7 +37773,7 @@
     method public void testStarted(java.lang.String);
   }
 
-  public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase {
+  public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
     ctor public ApplicationTestCase(java.lang.Class<T>);
     method protected final void createApplication();
     method public T getApplication();
@@ -37799,8 +37799,8 @@
     method public android.app.Instrumentation getInstrumentation();
     method public deprecated void injectInsrumentation(android.app.Instrumentation);
     method public void injectInstrumentation(android.app.Instrumentation);
-    method public final T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
-    method public final T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
+    method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
+    method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
     method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable;
     method public void sendKeys(java.lang.String);
     method public void sendKeys(int...);
@@ -37840,7 +37840,7 @@
 
   public class LoaderTestCase extends android.test.AndroidTestCase {
     ctor public LoaderTestCase();
-    method public T getLoaderResultSynchronously(android.content.Loader<T>);
+    method public <T> T getLoaderResultSynchronously(android.content.Loader<T>);
   }
 
   public final deprecated class MoreAsserts {
@@ -37895,20 +37895,20 @@
     method public abstract void startTiming(boolean);
   }
 
-  public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase {
+  public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
     ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String);
     method public android.test.mock.MockContentResolver getMockContentResolver();
     method public android.test.IsolatedContext getMockContext();
     method public T getProvider();
-    method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
-  public abstract class ProviderTestCase2 extends android.test.AndroidTestCase {
+  public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase {
     ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String);
     method public android.test.mock.MockContentResolver getMockContentResolver();
     method public android.test.IsolatedContext getMockContext();
     method public T getProvider();
-    method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
   public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper {
@@ -37916,11 +37916,11 @@
     ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String);
     method public java.lang.String getDatabasePrefix();
     method public void makeExistingFilesAndDbsAccessible();
-    method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
-    method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
-  public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase {
+  public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
     ctor public ServiceTestCase(java.lang.Class<T>);
     method protected android.os.IBinder bindService(android.content.Intent);
     method public android.app.Application getApplication();
@@ -37933,7 +37933,7 @@
     method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
   }
 
-  public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase {
+  public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
     ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>);
     method public T getActivity();
     method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
@@ -38288,7 +38288,7 @@
     ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
     ctor public TestMethod(junit.framework.TestCase);
     method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass();
     method public java.lang.String getEnclosingClassname();
     method public java.lang.String getName();
@@ -38736,7 +38736,7 @@
     method public int getSpanEnd(java.lang.Object);
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
-    method public T[] getSpans(int, int, java.lang.Class<T>);
+    method public <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint);
     method public int getTextWatcherDepth();
     method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int);
@@ -38758,7 +38758,7 @@
     method public int getSpanEnd(java.lang.Object);
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
-    method public T[] getSpans(int, int, java.lang.Class<T>);
+    method public <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public final int length();
     method public int nextSpanTransition(int, int, java.lang.Class);
     method public final java.lang.String toString();
@@ -38768,7 +38768,7 @@
     method public abstract int getSpanEnd(java.lang.Object);
     method public abstract int getSpanFlags(java.lang.Object);
     method public abstract int getSpanStart(java.lang.Object);
-    method public abstract T[] getSpans(int, int, java.lang.Class<T>);
+    method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public abstract int nextSpanTransition(int, int, java.lang.Class);
     field public static final int SPAN_COMPOSING = 256; // 0x100
     field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21
@@ -39746,7 +39746,7 @@
     field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
   }
 
-  public static class TtsSpan.Builder {
+  public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> {
     ctor public TtsSpan.Builder(java.lang.String);
     method public android.text.style.TtsSpan build();
     method public C setIntArgument(java.lang.String, int);
@@ -39842,7 +39842,7 @@
     method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String);
   }
 
-  public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder {
+  public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder {
     ctor public TtsSpan.SemioticClassBuilder(java.lang.String);
     method public C setAnimacy(java.lang.String);
     method public C setCase(java.lang.String);
@@ -40249,7 +40249,7 @@
     ctor public AndroidRuntimeException(java.lang.Exception);
   }
 
-  public final class ArrayMap implements java.util.Map {
+  public final class ArrayMap<K, V> implements java.util.Map {
     ctor public ArrayMap();
     ctor public ArrayMap(int);
     ctor public ArrayMap(android.util.ArrayMap<K, V>);
@@ -40277,7 +40277,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public final class ArraySet implements java.util.Collection java.util.Set {
+  public final class ArraySet<E> implements java.util.Collection java.util.Set {
     ctor public ArraySet();
     ctor public ArraySet(int);
     ctor public ArraySet(android.util.ArraySet<E>);
@@ -40298,7 +40298,7 @@
     method public boolean retainAll(java.util.Collection<?>);
     method public int size();
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
     method public E valueAt(int);
   }
 
@@ -40443,13 +40443,13 @@
   public deprecated class FloatMath {
   }
 
-  public abstract class FloatProperty extends android.util.Property {
+  public abstract class FloatProperty<T> extends android.util.Property {
     ctor public FloatProperty(java.lang.String);
     method public final void set(T, java.lang.Float);
     method public abstract void setValue(T, float);
   }
 
-  public abstract class IntProperty extends android.util.Property {
+  public abstract class IntProperty<T> extends android.util.Property {
     ctor public IntProperty(java.lang.String);
     method public final void set(T, java.lang.Integer);
     method public abstract void setValue(T, int);
@@ -40549,7 +40549,7 @@
     method public void println(java.lang.String);
   }
 
-  public class LongSparseArray implements java.lang.Cloneable {
+  public class LongSparseArray<E> implements java.lang.Cloneable {
     ctor public LongSparseArray();
     ctor public LongSparseArray(int);
     method public void append(long, E);
@@ -40570,7 +40570,7 @@
     method public E valueAt(int);
   }
 
-  public class LruCache {
+  public class LruCache<K, V> {
     ctor public LruCache(int);
     method protected V create(K);
     method public final synchronized int createCount();
@@ -40658,9 +40658,9 @@
     ctor public NoSuchPropertyException(java.lang.String);
   }
 
-  public class Pair {
+  public class Pair<F, S> {
     ctor public Pair(F, S);
-    method public static android.util.Pair<A, B> create(A, B);
+    method public static <A, B> android.util.Pair<A, B> create(A, B);
     field public final F first;
     field public final S second;
   }
@@ -40693,22 +40693,22 @@
     method public abstract void println(java.lang.String);
   }
 
-  public abstract class Property {
+  public abstract class Property<T, V> {
     ctor public Property(java.lang.Class<V>, java.lang.String);
     method public abstract V get(T);
     method public java.lang.String getName();
     method public java.lang.Class<V> getType();
     method public boolean isReadOnly();
-    method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
+    method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
     method public void set(T, V);
   }
 
-  public final class Range {
+  public final class Range<T extends java.lang.Comparable<? super T>> {
     ctor public Range(T, T);
     method public T clamp(T);
     method public boolean contains(T);
     method public boolean contains(android.util.Range<T>);
-    method public static android.util.Range<T> create(T, T);
+    method public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> create(T, T);
     method public android.util.Range<T> extend(android.util.Range<T>);
     method public android.util.Range<T> extend(T, T);
     method public android.util.Range<T> extend(T);
@@ -40752,7 +40752,7 @@
     method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException;
   }
 
-  public class SparseArray implements java.lang.Cloneable {
+  public class SparseArray<E> implements java.lang.Cloneable {
     ctor public SparseArray();
     ctor public SparseArray(int);
     method public void append(int, E);
@@ -45487,7 +45487,7 @@
     method public static java.lang.String stripAnchor(java.lang.String);
   }
 
-  public abstract interface ValueCallback {
+  public abstract interface ValueCallback<T> {
     method public abstract void onReceiveValue(T);
   }
 
@@ -46221,7 +46221,7 @@
     field public static final int NO_SELECTION = -2147483648; // 0x80000000
   }
 
-  public abstract class AdapterView extends android.view.ViewGroup {
+  public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup {
     ctor public AdapterView(android.content.Context);
     ctor public AdapterView(android.content.Context, android.util.AttributeSet);
     ctor public AdapterView(android.content.Context, android.util.AttributeSet, int);
@@ -46344,7 +46344,7 @@
     ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
   }
 
-  public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
+  public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
     ctor public ArrayAdapter(android.content.Context, int);
     ctor public ArrayAdapter(android.content.Context, int, int);
     ctor public ArrayAdapter(android.content.Context, int, T[]);
@@ -46405,7 +46405,7 @@
     method protected void performFiltering(java.lang.CharSequence, int);
     method public void performValidation();
     method protected void replaceText(java.lang.CharSequence);
-    method public void setAdapter(T);
+    method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T);
     method public void setCompletionHint(java.lang.CharSequence);
     method public void setDropDownAnchor(int);
     method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -48691,7 +48691,7 @@
 
 package com.android.internal.util {
 
-  public abstract interface Predicate {
+  public abstract interface Predicate<T> {
     method public abstract boolean apply(T);
   }
 
@@ -50763,22 +50763,22 @@
     enum_constant public static final java.lang.Character.UnicodeScript YI;
   }
 
-  public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
-    method public java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
+  public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
+    method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
     method public T cast(java.lang.Object);
     method public boolean desiredAssertionStatus();
     method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException;
     method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException;
-    method public A getAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getAnnotations();
-    method public A[] getAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
     method public java.lang.String getCanonicalName();
     method public java.lang.ClassLoader getClassLoader();
     method public java.lang.Class<?>[] getClasses();
     method public java.lang.Class<?> getComponentType();
     method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
     method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
-    method public A getDeclaredAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public java.lang.Class<?>[] getDeclaredClasses();
     method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
@@ -50890,7 +50890,7 @@
   public abstract interface Cloneable {
   }
 
-  public abstract interface Comparable {
+  public abstract interface Comparable<T> {
     method public abstract int compareTo(T);
   }
 
@@ -50944,7 +50944,7 @@
     field public static final java.lang.Class<java.lang.Double> TYPE;
   }
 
-  public abstract class Enum implements java.lang.Comparable java.io.Serializable {
+  public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable {
     ctor protected Enum(java.lang.String, int);
     method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException;
     method public final int compareTo(E);
@@ -50954,7 +50954,7 @@
     method public final int hashCode();
     method public final java.lang.String name();
     method public final int ordinal();
-    method public static T valueOf(java.lang.Class<T>, java.lang.String);
+    method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String);
   }
 
   public class EnumConstantNotPresentException extends java.lang.RuntimeException {
@@ -51073,7 +51073,7 @@
     ctor public IndexOutOfBoundsException(java.lang.String);
   }
 
-  public class InheritableThreadLocal extends java.lang.ThreadLocal {
+  public class InheritableThreadLocal<T> extends java.lang.ThreadLocal {
     ctor public InheritableThreadLocal();
     method protected T childValue(T);
   }
@@ -51152,7 +51152,7 @@
     ctor public InterruptedException(java.lang.String);
   }
 
-  public abstract interface Iterable {
+  public abstract interface Iterable<T> {
     method public default void forEach(java.util.function.Consumer<? super T>);
     method public abstract java.util.Iterator<T> iterator();
     method public default java.util.Spliterator<T> spliterator();
@@ -51367,12 +51367,12 @@
   }
 
   public class Package implements java.lang.reflect.AnnotatedElement {
-    method public A getAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getAnnotations();
-    method public A[] getAnnotationsByType(java.lang.Class<A>);
-    method public A getDeclaredAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
     method public java.lang.String getImplementationTitle();
     method public java.lang.String getImplementationVendor();
     method public java.lang.String getImplementationVersion();
@@ -51971,13 +51971,13 @@
     method public void uncaughtException(java.lang.Thread, java.lang.Throwable);
   }
 
-  public class ThreadLocal {
+  public class ThreadLocal<T> {
     ctor public ThreadLocal();
     method public T get();
     method protected T initialValue();
     method public void remove();
     method public void set(T);
-    method public static java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
+    method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
   }
 
   public class Throwable implements java.io.Serializable {
@@ -52115,30 +52115,30 @@
 
 package java.lang.ref {
 
-  public class PhantomReference extends java.lang.ref.Reference {
+  public class PhantomReference<T> extends java.lang.ref.Reference {
     ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
 
-  public abstract class Reference {
+  public abstract class Reference<T> {
     method public void clear();
     method public boolean enqueue();
     method public T get();
     method public boolean isEnqueued();
   }
 
-  public class ReferenceQueue {
+  public class ReferenceQueue<T> {
     ctor public ReferenceQueue();
     method public java.lang.ref.Reference<? extends T> poll();
     method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException;
     method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException;
   }
 
-  public class SoftReference extends java.lang.ref.Reference {
+  public class SoftReference<T> extends java.lang.ref.Reference {
     ctor public SoftReference(T);
     ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
 
-  public class WeakReference extends java.lang.ref.Reference {
+  public class WeakReference<T> extends java.lang.ref.Reference {
     ctor public WeakReference(T);
     ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
@@ -52149,7 +52149,7 @@
 
   public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
     ctor protected AccessibleObject();
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.annotation.Annotation[] getAnnotations();
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public boolean isAccessible();
@@ -52158,12 +52158,12 @@
   }
 
   public abstract interface AnnotatedElement {
-    method public abstract T getAnnotation(java.lang.Class<T>);
+    method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public abstract java.lang.annotation.Annotation[] getAnnotations();
-    method public default T[] getAnnotationsByType(java.lang.Class<T>);
-    method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
     method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public default T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
     method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
   }
 
@@ -52191,7 +52191,7 @@
     method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
   }
 
-  public final class Constructor extends java.lang.reflect.Executable {
+  public final class Constructor<T> extends java.lang.reflect.Executable {
     method public java.lang.Class<T> getDeclaringClass();
     method public java.lang.Class<?>[] getExceptionTypes();
     method public int getModifiers();
@@ -52339,7 +52339,7 @@
   }
 
   public final class Parameter implements java.lang.reflect.AnnotatedElement {
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.annotation.Annotation[] getAnnotations();
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public java.lang.reflect.Executable getDeclaringExecutable();
@@ -52376,7 +52376,7 @@
   public abstract interface Type {
   }
 
-  public abstract interface TypeVariable implements java.lang.reflect.Type {
+  public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type {
     method public abstract java.lang.reflect.Type[] getBounds();
     method public abstract D getGenericDeclaration();
     method public abstract java.lang.String getName();
@@ -53165,7 +53165,7 @@
     method public abstract java.net.SocketImpl createSocketImpl();
   }
 
-  public abstract interface SocketOption {
+  public abstract interface SocketOption<T> {
     method public abstract java.lang.String name();
     method public abstract java.lang.Class<T> type();
   }
@@ -53697,9 +53697,9 @@
   }
 
   public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel {
-    method public abstract void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
-    method public abstract void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
   }
 
@@ -53727,25 +53727,25 @@
   public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel {
     ctor protected AsynchronousFileChannel();
     method public abstract void force(boolean) throws java.io.IOException;
-    method public abstract void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
-    method public final void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+    method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+    method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
     method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean);
     method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock();
     method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
-    method public abstract void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long);
     method public abstract long size() throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException;
     method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException;
     method public final java.nio.channels.FileLock tryLock() throws java.io.IOException;
-    method public abstract void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long);
   }
 
   public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel {
     ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
-    method public abstract void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
+    method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
     method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept();
     method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
@@ -53753,30 +53753,30 @@
     method public static java.nio.channels.AsynchronousServerSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousServerSocketChannel open() throws java.io.IOException;
     method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
-    method public abstract java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
   }
 
   public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel {
     ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
     method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
-    method public abstract void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
+    method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress);
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
     method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException;
     method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException;
     method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
-    method public abstract void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
-    method public final void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
-    method public abstract void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
-    method public abstract java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+    method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException;
-    method public abstract void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
-    method public final void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
-    method public abstract void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
   }
 
   public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel {
@@ -53816,7 +53816,7 @@
     ctor public ClosedSelectorException();
   }
 
-  public abstract interface CompletionHandler {
+  public abstract interface CompletionHandler<V, A> {
     method public abstract void completed(V, A);
     method public abstract void failed(java.lang.Throwable, A);
   }
@@ -53840,7 +53840,7 @@
     method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
     method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException;
     method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException;
-    method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.net.DatagramSocket socket();
     method public final int validOps();
     method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException;
@@ -53945,8 +53945,8 @@
   public abstract interface NetworkChannel implements java.nio.channels.Channel {
     method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException;
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
-    method public abstract T getOption(java.net.SocketOption<T>) throws java.io.IOException;
-    method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions();
   }
 
@@ -54068,7 +54068,7 @@
     method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
     method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException;
-    method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.net.ServerSocket socket();
     method public final int validOps();
   }
@@ -54091,7 +54091,7 @@
     method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException;
     method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
     method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
-    method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException;
     method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException;
     method public abstract java.net.Socket socket();
@@ -54376,11 +54376,11 @@
     ctor public DirectoryNotEmptyException(java.lang.String);
   }
 
-  public abstract interface DirectoryStream implements java.io.Closeable java.lang.Iterable {
+  public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable {
     method public abstract java.util.Iterator<T> iterator();
   }
 
-  public static abstract interface DirectoryStream.Filter {
+  public static abstract interface DirectoryStream.Filter<T> {
     method public abstract boolean accept(T) throws java.io.IOException;
   }
 
@@ -54392,7 +54392,7 @@
   public abstract class FileStore {
     ctor protected FileStore();
     method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException;
-    method public abstract V getFileStoreAttributeView(java.lang.Class<V>);
+    method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>);
     method public abstract long getTotalSpace() throws java.io.IOException;
     method public abstract long getUnallocatedSpace() throws java.io.IOException;
     method public abstract long getUsableSpace() throws java.io.IOException;
@@ -54464,7 +54464,7 @@
     enum_constant public static final java.nio.file.FileVisitResult TERMINATE;
   }
 
-  public abstract interface FileVisitor {
+  public abstract interface FileVisitor<T> {
     method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
     method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
     method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -54489,7 +54489,7 @@
     method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...);
     method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException;
     method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
-    method public static V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
     method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -54522,7 +54522,7 @@
     method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException;
     method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException;
     method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException;
-    method public static A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+    method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
     method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -54630,17 +54630,17 @@
     ctor public ReadOnlyFileSystemException();
   }
 
-  public abstract interface SecureDirectoryStream implements java.nio.file.DirectoryStream {
+  public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream {
     method public abstract void deleteDirectory(T) throws java.io.IOException;
     method public abstract void deleteFile(T) throws java.io.IOException;
-    method public abstract V getFileAttributeView(java.lang.Class<V>);
-    method public abstract V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException;
   }
 
-  public class SimpleFileVisitor implements java.nio.file.FileVisitor {
+  public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor {
     ctor protected SimpleFileVisitor();
     method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
     method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -54678,13 +54678,13 @@
     field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW;
   }
 
-  public abstract interface WatchEvent {
+  public abstract interface WatchEvent<T> {
     method public abstract T context();
     method public abstract int count();
     method public abstract java.nio.file.WatchEvent.Kind<T> kind();
   }
 
-  public static abstract interface WatchEvent.Kind {
+  public static abstract interface WatchEvent.Kind<T> {
     method public abstract java.lang.String name();
     method public abstract java.lang.Class<T> type();
   }
@@ -54820,7 +54820,7 @@
     method public abstract boolean isSystem();
   }
 
-  public abstract interface FileAttribute {
+  public abstract interface FileAttribute<T> {
     method public abstract java.lang.String name();
     method public abstract T value();
   }
@@ -54917,7 +54917,7 @@
     method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public abstract void delete(java.nio.file.Path) throws java.io.IOException;
     method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException;
-    method public abstract V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
     method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
     method public abstract java.nio.file.Path getPath(java.net.URI);
@@ -54934,7 +54934,7 @@
     method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException;
     method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
     method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
-    method public abstract A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+    method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
     method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
     method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
     method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -54964,12 +54964,12 @@
 
   public final class AccessController {
     method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException;
-    method public static T doPrivileged(java.security.PrivilegedAction<T>);
-    method public static T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
-    method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
-    method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
-    method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>);
-    method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>);
+    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
+    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>);
+    method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
     method public static java.security.AccessControlContext getContext();
   }
 
@@ -55008,7 +55008,7 @@
     method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
-    method public final T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+    method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
     method public final java.security.Provider getProvider();
     method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
     method public final void init(byte[]) throws java.io.IOException;
@@ -55020,7 +55020,7 @@
     ctor public AlgorithmParametersSpi();
     method protected abstract byte[] engineGetEncoded() throws java.io.IOException;
     method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException;
-    method protected abstract T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+    method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
     method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
     method protected abstract void engineInit(byte[]) throws java.io.IOException;
     method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException;
@@ -55212,7 +55212,7 @@
     method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
-    method public final T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+    method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
     method public final java.security.Provider getProvider();
     method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException;
   }
@@ -55221,7 +55221,7 @@
     ctor public KeyFactorySpi();
     method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
     method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
-    method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+    method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
     method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException;
   }
 
@@ -55509,7 +55509,7 @@
     field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L
   }
 
-  public abstract interface PrivilegedAction {
+  public abstract interface PrivilegedAction<T> {
     method public abstract T run();
   }
 
@@ -55518,7 +55518,7 @@
     method public java.lang.Exception getException();
   }
 
-  public abstract interface PrivilegedExceptionAction {
+  public abstract interface PrivilegedExceptionAction<T> {
     method public abstract T run() throws java.lang.Exception;
   }
 
@@ -57712,11 +57712,11 @@
     method public abstract void free() throws java.sql.SQLException;
     method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException;
     method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException;
-    method public abstract T getSource(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException;
     method public abstract java.lang.String getString() throws java.sql.SQLException;
     method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException;
     method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException;
-    method public abstract T setResult(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException;
     method public abstract void setString(java.lang.String) throws java.sql.SQLException;
   }
 
@@ -57840,7 +57840,7 @@
 
   public abstract interface Wrapper {
     method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
-    method public abstract T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
   }
 
 }
@@ -58373,7 +58373,7 @@
 
 package java.util {
 
-  public abstract class AbstractCollection implements java.util.Collection {
+  public abstract class AbstractCollection<E> implements java.util.Collection {
     ctor protected AbstractCollection();
     method public boolean add(E);
     method public boolean addAll(java.util.Collection<? extends E>);
@@ -58387,10 +58387,10 @@
     method public boolean retainAll(java.util.Collection<?>);
     method public abstract int size();
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
   }
 
-  public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List {
+  public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List {
     ctor protected AbstractList();
     method public void add(int, E);
     method public boolean addAll(int, java.util.Collection<? extends E>);
@@ -58407,7 +58407,7 @@
     field protected transient int modCount;
   }
 
-  public abstract class AbstractMap implements java.util.Map {
+  public abstract class AbstractMap<K, V> implements java.util.Map {
     ctor protected AbstractMap();
     method public void clear();
     method public boolean containsKey(java.lang.Object);
@@ -58423,7 +58423,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable {
+  public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
     ctor public AbstractMap.SimpleEntry(K, V);
     ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>);
     method public K getKey();
@@ -58431,7 +58431,7 @@
     method public V setValue(V);
   }
 
-  public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable {
+  public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
     ctor public AbstractMap.SimpleImmutableEntry(K, V);
     ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>);
     method public K getKey();
@@ -58439,23 +58439,23 @@
     method public V setValue(V);
   }
 
-  public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue {
+  public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue {
     ctor protected AbstractQueue();
     method public E element();
     method public E remove();
   }
 
-  public abstract class AbstractSequentialList extends java.util.AbstractList {
+  public abstract class AbstractSequentialList<E> extends java.util.AbstractList {
     ctor protected AbstractSequentialList();
     method public E get(int);
     method public abstract java.util.ListIterator<E> listIterator(int);
   }
 
-  public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set {
+  public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set {
     ctor protected AbstractSet();
   }
 
-  public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
+  public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
     ctor public ArrayDeque();
     ctor public ArrayDeque(int);
     ctor public ArrayDeque(java.util.Collection<? extends E>);
@@ -58487,7 +58487,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public ArrayList(int);
     ctor public ArrayList();
     ctor public ArrayList(java.util.Collection<? extends E>);
@@ -58504,7 +58504,7 @@
   }
 
   public class Arrays {
-    method public static java.util.List<T> asList(T...);
+    method public static <T> java.util.List<T> asList(T...);
     method public static int binarySearch(long[], long);
     method public static int binarySearch(long[], int, int, long);
     method public static int binarySearch(int[], int);
@@ -58521,10 +58521,10 @@
     method public static int binarySearch(float[], int, int, float);
     method public static int binarySearch(java.lang.Object[], java.lang.Object);
     method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object);
-    method public static int binarySearch(T[], T, java.util.Comparator<? super T>);
-    method public static int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
-    method public static T[] copyOf(T[], int);
-    method public static T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
+    method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>);
+    method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
+    method public static <T> T[] copyOf(T[], int);
+    method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
     method public static byte[] copyOf(byte[], int);
     method public static short[] copyOf(short[], int);
     method public static int[] copyOf(int[], int);
@@ -58533,8 +58533,8 @@
     method public static float[] copyOf(float[], int);
     method public static double[] copyOf(double[], int);
     method public static boolean[] copyOf(boolean[], int);
-    method public static T[] copyOfRange(T[], int, int);
-    method public static T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
+    method public static <T> T[] copyOfRange(T[], int, int);
+    method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
     method public static byte[] copyOfRange(byte[], int, int);
     method public static short[] copyOfRange(short[], int, int);
     method public static int[] copyOfRange(int[], int, int);
@@ -58582,15 +58582,15 @@
     method public static int hashCode(float[]);
     method public static int hashCode(double[]);
     method public static int hashCode(java.lang.Object[]);
-    method public static void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
-    method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
     method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator);
     method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator);
     method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator);
     method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator);
     method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator);
     method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator);
-    method public static void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
+    method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
     method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator);
     method public static void parallelSetAll(long[], java.util.function.IntToLongFunction);
     method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction);
@@ -58608,11 +58608,11 @@
     method public static void parallelSort(float[], int, int);
     method public static void parallelSort(double[]);
     method public static void parallelSort(double[], int, int);
-    method public static void parallelSort(T[]);
-    method public static void parallelSort(T[], int, int);
-    method public static void parallelSort(T[], java.util.Comparator<? super T>);
-    method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>);
-    method public static void setAll(T[], java.util.function.IntFunction<? extends T>);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int);
+    method public static <T> void parallelSort(T[], java.util.Comparator<? super T>);
+    method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>);
+    method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>);
     method public static void setAll(int[], java.util.function.IntUnaryOperator);
     method public static void setAll(long[], java.util.function.IntToLongFunction);
     method public static void setAll(double[], java.util.function.IntToDoubleFunction);
@@ -58632,18 +58632,18 @@
     method public static void sort(double[], int, int);
     method public static void sort(java.lang.Object[]);
     method public static void sort(java.lang.Object[], int, int);
-    method public static void sort(T[], java.util.Comparator<? super T>);
-    method public static void sort(T[], int, int, java.util.Comparator<? super T>);
-    method public static java.util.Spliterator<T> spliterator(T[]);
-    method public static java.util.Spliterator<T> spliterator(T[], int, int);
+    method public static <T> void sort(T[], java.util.Comparator<? super T>);
+    method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>);
+    method public static <T> java.util.Spliterator<T> spliterator(T[]);
+    method public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
     method public static java.util.Spliterator.OfInt spliterator(int[]);
     method public static java.util.Spliterator.OfInt spliterator(int[], int, int);
     method public static java.util.Spliterator.OfLong spliterator(long[]);
     method public static java.util.Spliterator.OfLong spliterator(long[], int, int);
     method public static java.util.Spliterator.OfDouble spliterator(double[]);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
-    method public static java.util.stream.Stream<T> stream(T[]);
-    method public static java.util.stream.Stream<T> stream(T[], int, int);
+    method public static <T> java.util.stream.Stream<T> stream(T[]);
+    method public static <T> java.util.stream.Stream<T> stream(T[], int, int);
     method public static java.util.stream.IntStream stream(int[]);
     method public static java.util.stream.IntStream stream(int[], int, int);
     method public static java.util.stream.LongStream stream(long[]);
@@ -58827,7 +58827,7 @@
     field protected long time;
   }
 
-  public abstract interface Collection implements java.lang.Iterable {
+  public abstract interface Collection<E> implements java.lang.Iterable {
     method public abstract boolean add(E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
     method public abstract void clear();
@@ -58845,86 +58845,86 @@
     method public abstract int size();
     method public default java.util.stream.Stream<E> stream();
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
   public class Collections {
-    method public static boolean addAll(java.util.Collection<? super T>, T...);
-    method public static java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
-    method public static int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
-    method public static int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
-    method public static java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
-    method public static java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
-    method public static java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
-    method public static java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
-    method public static java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
-    method public static java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
-    method public static void copy(java.util.List<? super T>, java.util.List<? extends T>);
+    method public static <T> boolean addAll(java.util.Collection<? super T>, T...);
+    method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
+    method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
+    method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
+    method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
+    method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
+    method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
+    method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
+    method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
+    method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
+    method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>);
     method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>);
-    method public static java.util.Enumeration<T> emptyEnumeration();
-    method public static java.util.Iterator<T> emptyIterator();
-    method public static final java.util.List<T> emptyList();
-    method public static java.util.ListIterator<T> emptyListIterator();
-    method public static final java.util.Map<K, V> emptyMap();
-    method public static final java.util.Set<T> emptySet();
-    method public static java.util.Enumeration<T> enumeration(java.util.Collection<T>);
-    method public static void fill(java.util.List<? super T>, T);
+    method public static <T> java.util.Enumeration<T> emptyEnumeration();
+    method public static <T> java.util.Iterator<T> emptyIterator();
+    method public static final <T> java.util.List<T> emptyList();
+    method public static <T> java.util.ListIterator<T> emptyListIterator();
+    method public static final <K, V> java.util.Map<K, V> emptyMap();
+    method public static final <T> java.util.Set<T> emptySet();
+    method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>);
+    method public static <T> void fill(java.util.List<? super T>, T);
     method public static int frequency(java.util.Collection<?>, java.lang.Object);
     method public static int indexOfSubList(java.util.List<?>, java.util.List<?>);
     method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>);
-    method public static java.util.ArrayList<T> list(java.util.Enumeration<T>);
-    method public static T max(java.util.Collection<? extends T>);
-    method public static T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
-    method public static T min(java.util.Collection<? extends T>);
-    method public static T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
-    method public static java.util.List<T> nCopies(int, T);
-    method public static java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
-    method public static boolean replaceAll(java.util.List<T>, T, T);
+    method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>);
+    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>);
+    method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
+    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>);
+    method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
+    method public static <T> java.util.List<T> nCopies(int, T);
+    method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
+    method public static <T> boolean replaceAll(java.util.List<T>, T, T);
     method public static void reverse(java.util.List<?>);
-    method public static java.util.Comparator<T> reverseOrder();
-    method public static java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
+    method public static <T> java.util.Comparator<T> reverseOrder();
+    method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
     method public static void rotate(java.util.List<?>, int);
     method public static void shuffle(java.util.List<?>);
     method public static void shuffle(java.util.List<?>, java.util.Random);
-    method public static java.util.Set<E> singleton(E);
-    method public static java.util.List<E> singletonList(E);
-    method public static java.util.Map<K, V> singletonMap(K, V);
-    method public static void sort(java.util.List<T>);
-    method public static void sort(java.util.List<T>, java.util.Comparator<? super T>);
+    method public static <E> java.util.Set<E> singleton(E);
+    method public static <E> java.util.List<E> singletonList(E);
+    method public static <K, V> java.util.Map<K, V> singletonMap(K, V);
+    method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>);
+    method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>);
     method public static void swap(java.util.List<?>, int, int);
-    method public static java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
-    method public static java.util.List<T> synchronizedList(java.util.List<T>);
-    method public static java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
-    method public static java.util.Set<T> synchronizedSet(java.util.Set<T>);
-    method public static java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
-    method public static java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
-    method public static java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
-    method public static java.util.List<T> unmodifiableList(java.util.List<? extends T>);
-    method public static java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
-    method public static java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
-    method public static java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
-    method public static java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
+    method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
+    method public static <T> java.util.List<T> synchronizedList(java.util.List<T>);
+    method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
+    method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>);
+    method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
+    method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
+    method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
+    method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>);
+    method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
+    method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
+    method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
+    method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
     field public static final java.util.List EMPTY_LIST;
     field public static final java.util.Map EMPTY_MAP;
     field public static final java.util.Set EMPTY_SET;
   }
 
-  public abstract interface Comparator {
+  public abstract interface Comparator<T> {
     method public abstract int compare(T, T);
-    method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
-    method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
+    method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
+    method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
     method public abstract boolean equals(java.lang.Object);
-    method public static java.util.Comparator<T> naturalOrder();
-    method public static java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
-    method public static java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
-    method public static java.util.Comparator<T> reverseOrder();
+    method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder();
+    method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
+    method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
+    method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder();
     method public default java.util.Comparator<T> reversed();
     method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>);
-    method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
-    method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
+    method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
+    method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
     method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>);
     method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>);
     method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>);
@@ -58983,7 +58983,7 @@
     method public deprecated java.lang.String toLocaleString();
   }
 
-  public abstract interface Deque implements java.util.Queue {
+  public abstract interface Deque<E> implements java.util.Queue {
     method public abstract boolean add(E);
     method public abstract void addFirst(E);
     method public abstract void addLast(E);
@@ -59013,7 +59013,7 @@
     method public abstract int size();
   }
 
-  public abstract class Dictionary {
+  public abstract class Dictionary<K, V> {
     ctor public Dictionary();
     method public abstract java.util.Enumeration<V> elements();
     method public abstract V get(java.lang.Object);
@@ -59044,7 +59044,7 @@
     ctor public EmptyStackException();
   }
 
-  public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
+  public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
     ctor public EnumMap(java.lang.Class<K>);
     ctor public EnumMap(java.util.EnumMap<K, ? extends V>);
     ctor public EnumMap(java.util.Map<K, ? extends V>);
@@ -59052,23 +59052,23 @@
     method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
   }
 
-  public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
-    method public static java.util.EnumSet<E> allOf(java.lang.Class<E>);
+  public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>);
     method public java.util.EnumSet<E> clone();
-    method public static java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
-    method public static java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
-    method public static java.util.EnumSet<E> copyOf(java.util.Collection<E>);
-    method public static java.util.EnumSet<E> noneOf(java.lang.Class<E>);
-    method public static java.util.EnumSet<E> of(E);
-    method public static java.util.EnumSet<E> of(E, E);
-    method public static java.util.EnumSet<E> of(E, E, E);
-    method public static java.util.EnumSet<E> of(E, E, E, E);
-    method public static java.util.EnumSet<E> of(E, E, E, E, E);
-    method public static java.util.EnumSet<E> of(E, E...);
-    method public static java.util.EnumSet<E> range(E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E);
   }
 
-  public abstract interface Enumeration {
+  public abstract interface Enumeration<E> {
     method public abstract boolean hasMoreElements();
     method public abstract E nextElement();
   }
@@ -59076,7 +59076,7 @@
   public abstract interface EventListener {
   }
 
-  public abstract class EventListenerProxy implements java.util.EventListener {
+  public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener {
     ctor public EventListenerProxy(T);
     method public T getListener();
   }
@@ -59162,7 +59162,7 @@
     field public static final int BC = 0; // 0x0
   }
 
-  public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public HashMap(int, float);
     ctor public HashMap(int);
     ctor public HashMap();
@@ -59182,7 +59182,7 @@
     method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
   }
 
-  public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+  public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
     ctor public HashSet();
     ctor public HashSet(java.util.Collection<? extends E>);
     ctor public HashSet(int, float);
@@ -59193,7 +59193,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public Hashtable(int, float);
     ctor public Hashtable(int);
     ctor public Hashtable();
@@ -59228,7 +59228,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public IdentityHashMap();
     ctor public IdentityHashMap(int);
     ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
@@ -59295,14 +59295,14 @@
     ctor public InvalidPropertiesFormatException(java.lang.String);
   }
 
-  public abstract interface Iterator {
+  public abstract interface Iterator<E> {
     method public default void forEachRemaining(java.util.function.Consumer<? super E>);
     method public abstract boolean hasNext();
     method public abstract E next();
     method public default void remove();
   }
 
-  public class LinkedHashMap extends java.util.HashMap implements java.util.Map {
+  public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map {
     ctor public LinkedHashMap(int, float);
     ctor public LinkedHashMap(int);
     ctor public LinkedHashMap();
@@ -59311,14 +59311,14 @@
     method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>);
   }
 
-  public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+  public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
     ctor public LinkedHashSet(int, float);
     ctor public LinkedHashSet(int);
     ctor public LinkedHashSet();
     ctor public LinkedHashSet(java.util.Collection<? extends E>);
   }
 
-  public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
+  public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
     ctor public LinkedList();
     ctor public LinkedList(java.util.Collection<? extends E>);
     method public void addFirst(E);
@@ -59349,7 +59349,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public abstract interface List implements java.util.Collection {
+  public abstract interface List<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract void add(int, E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
@@ -59376,10 +59376,10 @@
     method public default void sort(java.util.Comparator<? super E>);
     method public abstract java.util.List<E> subList(int, int);
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
-  public abstract interface ListIterator implements java.util.Iterator {
+  public abstract interface ListIterator<E> implements java.util.Iterator {
     method public abstract void add(E);
     method public abstract boolean hasNext();
     method public abstract boolean hasPrevious();
@@ -59496,7 +59496,7 @@
     method public final long getSum();
   }
 
-  public abstract interface Map {
+  public abstract interface Map<K, V> {
     method public abstract void clear();
     method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
     method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
@@ -59524,11 +59524,11 @@
     method public abstract java.util.Collection<V> values();
   }
 
-  public static abstract interface Map.Entry {
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
+  public static abstract interface Map.Entry<K, V> {
+    method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
+    method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
+    method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
+    method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
     method public abstract boolean equals(java.lang.Object);
     method public abstract K getKey();
     method public abstract V getValue();
@@ -59552,7 +59552,7 @@
     method public java.lang.String getKey();
   }
 
-  public abstract interface NavigableMap implements java.util.SortedMap {
+  public abstract interface NavigableMap<K, V> implements java.util.SortedMap {
     method public abstract java.util.Map.Entry<K, V> ceilingEntry(K);
     method public abstract K ceilingKey(K);
     method public abstract java.util.NavigableSet<K> descendingKeySet();
@@ -59576,7 +59576,7 @@
     method public abstract java.util.SortedMap<K, V> tailMap(K);
   }
 
-  public abstract interface NavigableSet implements java.util.SortedSet {
+  public abstract interface NavigableSet<E> implements java.util.SortedSet {
     method public abstract E ceiling(E);
     method public abstract java.util.Iterator<E> descendingIterator();
     method public abstract java.util.NavigableSet<E> descendingSet();
@@ -59600,16 +59600,16 @@
   }
 
   public final class Objects {
-    method public static int compare(T, T, java.util.Comparator<? super T>);
+    method public static <T> int compare(T, T, java.util.Comparator<? super T>);
     method public static boolean deepEquals(java.lang.Object, java.lang.Object);
     method public static boolean equals(java.lang.Object, java.lang.Object);
     method public static int hash(java.lang.Object...);
     method public static int hashCode(java.lang.Object);
     method public static boolean isNull(java.lang.Object);
     method public static boolean nonNull(java.lang.Object);
-    method public static T requireNonNull(T);
-    method public static T requireNonNull(T, java.lang.String);
-    method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
+    method public static <T> T requireNonNull(T);
+    method public static <T> T requireNonNull(T, java.lang.String);
+    method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
     method public static java.lang.String toString(java.lang.Object);
     method public static java.lang.String toString(java.lang.Object, java.lang.String);
   }
@@ -59631,19 +59631,19 @@
     method public abstract void update(java.util.Observable, java.lang.Object);
   }
 
-  public final class Optional {
-    method public static java.util.Optional<T> empty();
+  public final class Optional<T> {
+    method public static <T> java.util.Optional<T> empty();
     method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>);
-    method public java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
+    method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
     method public T get();
     method public void ifPresent(java.util.function.Consumer<? super T>);
     method public boolean isPresent();
-    method public java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.Optional<T> of(T);
-    method public static java.util.Optional<T> ofNullable(T);
+    method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
+    method public static <T> java.util.Optional<T> of(T);
+    method public static <T> java.util.Optional<T> ofNullable(T);
     method public T orElse(T);
     method public T orElseGet(java.util.function.Supplier<? extends T>);
-    method public T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
   }
 
   public final class OptionalDouble {
@@ -59654,7 +59654,7 @@
     method public static java.util.OptionalDouble of(double);
     method public double orElse(double);
     method public double orElseGet(java.util.function.DoubleSupplier);
-    method public double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
   public final class OptionalInt {
@@ -59665,7 +59665,7 @@
     method public static java.util.OptionalInt of(int);
     method public int orElse(int);
     method public int orElseGet(java.util.function.IntSupplier);
-    method public int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
   public final class OptionalLong {
@@ -59676,10 +59676,10 @@
     method public static java.util.OptionalLong of(long);
     method public long orElse(long);
     method public long orElseGet(java.util.function.LongSupplier);
-    method public long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
-  public abstract interface PrimitiveIterator implements java.util.Iterator {
+  public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator {
     method public abstract void forEachRemaining(T_CONS);
   }
 
@@ -59704,7 +59704,7 @@
     method public abstract long nextLong();
   }
 
-  public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable {
+  public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable {
     ctor public PriorityQueue();
     ctor public PriorityQueue(int);
     ctor public PriorityQueue(java.util.Comparator<? super E>);
@@ -59753,7 +59753,7 @@
     method public java.lang.Object handleGetObject(java.lang.String);
   }
 
-  public abstract interface Queue implements java.util.Collection {
+  public abstract interface Queue<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract E element();
     method public abstract boolean offer(E);
@@ -59905,15 +59905,15 @@
     ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable);
   }
 
-  public final class ServiceLoader implements java.lang.Iterable {
+  public final class ServiceLoader<S> implements java.lang.Iterable {
     method public java.util.Iterator<S> iterator();
-    method public static java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
-    method public static java.util.ServiceLoader<S> load(java.lang.Class<S>);
-    method public static java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
+    method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
+    method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>);
+    method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
     method public void reload();
   }
 
-  public abstract interface Set implements java.util.Collection {
+  public abstract interface Set<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
     method public abstract void clear();
@@ -59928,7 +59928,7 @@
     method public abstract boolean retainAll(java.util.Collection<?>);
     method public abstract int size();
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
   public class SimpleTimeZone extends java.util.TimeZone {
@@ -59954,7 +59954,7 @@
     field public static final int WALL_TIME = 0; // 0x0
   }
 
-  public abstract interface SortedMap implements java.util.Map {
+  public abstract interface SortedMap<K, V> implements java.util.Map {
     method public abstract java.util.Comparator<? super K> comparator();
     method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet();
     method public abstract K firstKey();
@@ -59966,7 +59966,7 @@
     method public abstract java.util.Collection<V> values();
   }
 
-  public abstract interface SortedSet implements java.util.Set {
+  public abstract interface SortedSet<E> implements java.util.Set {
     method public abstract java.util.Comparator<? super E> comparator();
     method public abstract E first();
     method public abstract java.util.SortedSet<E> headSet(E);
@@ -59975,7 +59975,7 @@
     method public abstract java.util.SortedSet<E> tailSet(E);
   }
 
-  public abstract interface Spliterator {
+  public abstract interface Spliterator<T> {
     method public abstract int characteristics();
     method public abstract long estimateSize();
     method public default void forEachRemaining(java.util.function.Consumer<? super T>);
@@ -60018,7 +60018,7 @@
     method public abstract java.util.Spliterator.OfLong trySplit();
   }
 
-  public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator {
+  public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator {
     method public default void forEachRemaining(T_CONS);
     method public abstract boolean tryAdvance(T_CONS);
     method public abstract T_SPLITR trySplit();
@@ -60028,25 +60028,25 @@
     method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator();
     method public static java.util.Spliterator.OfInt emptyIntSpliterator();
     method public static java.util.Spliterator.OfLong emptyLongSpliterator();
-    method public static java.util.Spliterator<T> emptySpliterator();
-    method public static java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>);
+    method public static <T> java.util.Spliterator<T> emptySpliterator();
+    method public static <T> java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>);
     method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt);
     method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong);
     method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble);
-    method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int);
-    method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
     method public static java.util.Spliterator.OfInt spliterator(int[], int);
     method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int);
     method public static java.util.Spliterator.OfLong spliterator(long[], int);
     method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int);
-    method public static java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int);
-    method public static java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int);
     method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int);
     method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int);
     method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int);
-    method public static java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int);
+    method public static <T> java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int);
     method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int);
     method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int);
     method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int);
@@ -60073,7 +60073,7 @@
     method public java.util.Spliterator.OfLong trySplit();
   }
 
-  public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator {
+  public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator {
     ctor protected Spliterators.AbstractSpliterator(long, int);
     method public int characteristics();
     method public long estimateSize();
@@ -60108,7 +60108,7 @@
     method public java.util.SplittableRandom split();
   }
 
-  public class Stack extends java.util.Vector {
+  public class Stack<E> extends java.util.Vector {
     ctor public Stack();
     method public boolean empty();
     method public synchronized E peek();
@@ -60192,7 +60192,7 @@
     ctor public TooManyListenersException(java.lang.String);
   }
 
-  public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
+  public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
     ctor public TreeMap();
     ctor public TreeMap(java.util.Comparator<? super K>);
     ctor public TreeMap(java.util.Map<? extends K, ? extends V>);
@@ -60229,7 +60229,7 @@
     method public java.util.SortedMap<K, V> tailMap(K);
   }
 
-  public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+  public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
     ctor public TreeSet();
     ctor public TreeSet(java.util.Comparator<? super E>);
     ctor public TreeSet(java.util.Collection<? extends E>);
@@ -60282,7 +60282,7 @@
     method public java.lang.String getFlags();
   }
 
-  public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public Vector(int, int);
     ctor public Vector(int);
     ctor public Vector();
@@ -60317,7 +60317,7 @@
     field protected java.lang.Object[] elementData;
   }
 
-  public class WeakHashMap extends java.util.AbstractMap implements java.util.Map {
+  public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map {
     ctor public WeakHashMap(int, float);
     ctor public WeakHashMap(int);
     ctor public WeakHashMap();
@@ -60333,18 +60333,18 @@
 
   public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService {
     ctor public AbstractExecutorService();
-    method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
-    method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
-    method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
-    method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
+    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+    method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
+    method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
     method public java.util.concurrent.Future<?> submit(java.lang.Runnable);
-    method public java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
-    method public java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+    method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+    method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
   }
 
-  public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public ArrayBlockingQueue(int);
     ctor public ArrayBlockingQueue(int, boolean);
     ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>);
@@ -60363,7 +60363,7 @@
     method public E take() throws java.lang.InterruptedException;
   }
 
-  public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque {
+  public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque {
     method public abstract boolean add(E);
     method public abstract void addFirst(E);
     method public abstract void addLast(E);
@@ -60395,7 +60395,7 @@
     method public abstract E takeLast() throws java.lang.InterruptedException;
   }
 
-  public abstract interface BlockingQueue implements java.util.Queue {
+  public abstract interface BlockingQueue<E> implements java.util.Queue {
     method public abstract boolean add(E);
     method public abstract boolean contains(java.lang.Object);
     method public abstract int drainTo(java.util.Collection<? super E>);
@@ -60414,7 +60414,7 @@
     ctor public BrokenBarrierException(java.lang.String);
   }
 
-  public abstract interface Callable {
+  public abstract interface Callable<V> {
     method public abstract V call() throws java.lang.Exception;
   }
 
@@ -60423,28 +60423,28 @@
     ctor public CancellationException(java.lang.String);
   }
 
-  public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
+  public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
     ctor public CompletableFuture();
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...);
     method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...);
-    method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
     method public boolean cancel(boolean);
     method public boolean complete(T);
     method public boolean completeExceptionally(java.lang.Throwable);
-    method public static java.util.concurrent.CompletableFuture<U> completedFuture(U);
+    method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U);
     method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
     method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
     method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
     method public T getNow(T);
     method public int getNumberOfDependents();
-    method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
     method public boolean isCancelled();
     method public boolean isCompletedExceptionally();
     method public boolean isDone();
@@ -60459,23 +60459,23 @@
     method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor);
-    method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
-    method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
+    method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
+    method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
@@ -60495,7 +60495,7 @@
     ctor public CompletionException(java.lang.Throwable);
   }
 
-  public abstract interface CompletionService {
+  public abstract interface CompletionService<V> {
     method public abstract java.util.concurrent.Future<V> poll();
     method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
     method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
@@ -60503,17 +60503,17 @@
     method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
   }
 
-  public abstract interface CompletionStage {
+  public abstract interface CompletionStage<T> {
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
-    method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
@@ -60523,18 +60523,18 @@
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
@@ -60544,7 +60544,7 @@
     method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor);
   }
 
-  public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
+  public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
     ctor public ConcurrentHashMap();
     ctor public ConcurrentHashMap(int);
     ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
@@ -60558,29 +60558,29 @@
     method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
     method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
     method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
-    method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
-    method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachKey(long, java.util.function.Consumer<? super K>);
-    method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachValue(long, java.util.function.Consumer<? super V>);
-    method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
     method public V getOrDefault(java.lang.Object, V);
     method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
     method public java.util.Enumeration<K> keys();
     method public long mappingCount();
     method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
-    method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
-    method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
+    method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
+    method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
     method public V putIfAbsent(K, V);
-    method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
-    method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator);
     method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator);
     method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>);
-    method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator);
     method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator);
@@ -60588,7 +60588,7 @@
     method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator);
     method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator);
     method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
-    method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
     method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
@@ -60596,13 +60596,13 @@
     method public boolean replace(K, V, V);
     method public V replace(K, V);
     method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
-    method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
-    method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
-    method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
-    method public U searchValues(long, java.util.function.Function<? super V, ? extends U>);
+    method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
+    method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
+    method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
+    method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>);
   }
 
-   static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable {
+   static abstract class ConcurrentHashMap.CollectionView<K, V, E> implements java.util.Collection java.io.Serializable {
     method public final void clear();
     method public abstract boolean contains(java.lang.Object);
     method public final boolean containsAll(java.util.Collection<?>);
@@ -60614,11 +60614,11 @@
     method public final boolean retainAll(java.util.Collection<?>);
     method public final int size();
     method public final java.lang.Object[] toArray();
-    method public final T[] toArray(T[]);
+    method public final <T> T[] toArray(T[]);
     method public final java.lang.String toString();
   }
 
-  public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set {
+  public static class ConcurrentHashMap.KeySetView<K, V> extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set {
     method public boolean add(K);
     method public boolean addAll(java.util.Collection<? extends K>);
     method public boolean contains(java.lang.Object);
@@ -60629,7 +60629,7 @@
     method public java.util.Spliterator<K> spliterator();
   }
 
-  public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
+  public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
     ctor public ConcurrentLinkedDeque();
     ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>);
     method public void addFirst(E);
@@ -60659,7 +60659,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
+  public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
     ctor public ConcurrentLinkedQueue();
     ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>);
     method public java.util.Iterator<E> iterator();
@@ -60670,14 +60670,14 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public abstract interface ConcurrentMap implements java.util.Map {
+  public abstract interface ConcurrentMap<K, V> implements java.util.Map {
     method public abstract V putIfAbsent(K, V);
     method public abstract boolean remove(java.lang.Object, java.lang.Object);
     method public abstract boolean replace(K, V, V);
     method public abstract V replace(K, V);
   }
 
-  public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
+  public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
     method public abstract java.util.NavigableSet<K> descendingKeySet();
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
@@ -60690,7 +60690,7 @@
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
   }
 
-  public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
+  public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
     ctor public ConcurrentSkipListMap();
     ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>);
     ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>);
@@ -60734,7 +60734,7 @@
     method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
   }
 
-  public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+  public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
     ctor public ConcurrentSkipListSet();
     ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>);
     ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>);
@@ -60762,7 +60762,7 @@
     method public java.util.NavigableSet<E> tailSet(E);
   }
 
-  public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public CopyOnWriteArrayList();
     ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>);
     ctor public CopyOnWriteArrayList(E[]);
@@ -60794,10 +60794,10 @@
     method public int size();
     method public java.util.List<E> subList(int, int);
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
   }
 
-  public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable {
+  public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable {
     ctor public CopyOnWriteArraySet();
     ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
     method public void forEach(java.util.function.Consumer<? super E>);
@@ -60815,7 +60815,7 @@
     method public long getCount();
   }
 
-  public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask {
+  public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask {
     ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int);
     ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>);
     ctor protected CountedCompleter();
@@ -60852,7 +60852,7 @@
     method public void reset();
   }
 
-  public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
+  public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
     ctor public DelayQueue();
     ctor public DelayQueue(java.util.Collection<? extends E>);
     method public int drainTo(java.util.Collection<? super E>);
@@ -60873,7 +60873,7 @@
     method public abstract long getDelay(java.util.concurrent.TimeUnit);
   }
 
-  public class Exchanger {
+  public class Exchanger<V> {
     ctor public Exchanger();
     method public V exchange(V) throws java.lang.InterruptedException;
     method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -60890,7 +60890,7 @@
     method public abstract void execute(java.lang.Runnable);
   }
 
-  public class ExecutorCompletionService implements java.util.concurrent.CompletionService {
+  public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService {
     ctor public ExecutorCompletionService(java.util.concurrent.Executor);
     ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>);
     method public java.util.concurrent.Future<V> poll();
@@ -60902,21 +60902,21 @@
 
   public abstract interface ExecutorService implements java.util.concurrent.Executor {
     method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
-    method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+    method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+    method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
     method public abstract boolean isShutdown();
     method public abstract boolean isTerminated();
     method public abstract void shutdown();
     method public abstract java.util.List<java.lang.Runnable> shutdownNow();
-    method public abstract java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
-    method public abstract java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+    method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+    method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
     method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable);
   }
 
   public class Executors {
-    method public static java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
+    method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>);
@@ -60933,8 +60933,8 @@
     method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory);
     method public static java.util.concurrent.ExecutorService newWorkStealingPool(int);
     method public static java.util.concurrent.ExecutorService newWorkStealingPool();
-    method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
-    method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
+    method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
+    method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
     method public static java.util.concurrent.ThreadFactory privilegedThreadFactory();
     method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService);
     method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService);
@@ -60962,7 +60962,7 @@
     method public long getStealCount();
     method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
     method public boolean hasQueuedSubmissions();
-    method public T invoke(java.util.concurrent.ForkJoinTask<T>);
+    method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>);
     method public boolean isQuiescent();
     method public boolean isShutdown();
     method public boolean isTerminated();
@@ -60971,7 +60971,7 @@
     method protected java.util.concurrent.ForkJoinTask<?> pollSubmission();
     method public void shutdown();
     method public java.util.List<java.lang.Runnable> shutdownNow();
-    method public java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
+    method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
     field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
   }
 
@@ -60984,11 +60984,11 @@
     method public abstract boolean isReleasable();
   }
 
-  public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable {
+  public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable {
     ctor public ForkJoinTask();
     method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable);
-    method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
-    method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
+    method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
+    method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
     method public boolean cancel(boolean);
     method public final boolean compareAndSetForkJoinTaskTag(short, short);
     method public void complete(V);
@@ -61008,7 +61008,7 @@
     method public final V invoke();
     method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>, java.util.concurrent.ForkJoinTask<?>);
     method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>...);
-    method public static java.util.Collection<T> invokeAll(java.util.Collection<T>);
+    method public static <T extends java.util.concurrent.ForkJoinTask<?>> java.util.Collection<T> invokeAll(java.util.Collection<T>);
     method public final boolean isCancelled();
     method public final boolean isCompletedAbnormally();
     method public final boolean isCompletedNormally();
@@ -61034,7 +61034,7 @@
     method protected void onTermination(java.lang.Throwable);
   }
 
-  public abstract interface Future {
+  public abstract interface Future<V> {
     method public abstract boolean cancel(boolean);
     method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
     method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -61042,7 +61042,7 @@
     method public abstract boolean isDone();
   }
 
-  public class FutureTask implements java.util.concurrent.RunnableFuture {
+  public class FutureTask<V> implements java.util.concurrent.RunnableFuture {
     ctor public FutureTask(java.util.concurrent.Callable<V>);
     ctor public FutureTask(java.lang.Runnable, V);
     method public boolean cancel(boolean);
@@ -61057,7 +61057,7 @@
     method protected void setException(java.lang.Throwable);
   }
 
-  public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
+  public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
     ctor public LinkedBlockingDeque();
     ctor public LinkedBlockingDeque(int);
     ctor public LinkedBlockingDeque(java.util.Collection<? extends E>);
@@ -61101,7 +61101,7 @@
     method public E takeLast() throws java.lang.InterruptedException;
   }
 
-  public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public LinkedBlockingQueue();
     ctor public LinkedBlockingQueue(int);
     ctor public LinkedBlockingQueue(java.util.Collection<? extends E>);
@@ -61120,7 +61120,7 @@
     method public E take() throws java.lang.InterruptedException;
   }
 
-  public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
+  public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
     ctor public LinkedTransferQueue();
     ctor public LinkedTransferQueue(java.util.Collection<? extends E>);
     method public int drainTo(java.util.Collection<? super E>);
@@ -61167,7 +61167,7 @@
     method public int register();
   }
 
-  public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public PriorityBlockingQueue();
     ctor public PriorityBlockingQueue(int);
     ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>);
@@ -61196,7 +61196,7 @@
     method protected final void setRawResult(java.lang.Void);
   }
 
-  public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask {
+  public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask {
     ctor public RecursiveTask();
     method protected abstract V compute();
     method protected final boolean exec();
@@ -61215,22 +61215,22 @@
     method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
   }
 
-  public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable {
+  public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable {
     method public abstract void run();
   }
 
-  public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
+  public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
     method public abstract boolean isPeriodic();
   }
 
   public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService {
     method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
-    method public abstract java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+    method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
     method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
   }
 
-  public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future {
+  public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future {
   }
 
   public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService {
@@ -61238,13 +61238,13 @@
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory);
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler);
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
-    method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
-    method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
+    method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
+    method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
     method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy();
     method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy();
     method public boolean getRemoveOnCancelPolicy();
     method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
-    method public java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+    method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
     method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean);
@@ -61274,7 +61274,7 @@
     method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
   }
 
-  public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public SynchronousQueue();
     ctor public SynchronousQueue(boolean);
     method public int drainTo(java.util.Collection<? super E>);
@@ -61392,7 +61392,7 @@
     ctor public TimeoutException(java.lang.String);
   }
 
-  public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue {
+  public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue {
     method public abstract int getWaitingConsumerCount();
     method public abstract boolean hasWaitingConsumer();
     method public abstract void transfer(E) throws java.lang.InterruptedException;
@@ -61462,7 +61462,7 @@
     method public final boolean weakCompareAndSet(int, int, int);
   }
 
-  public abstract class AtomicIntegerFieldUpdater {
+  public abstract class AtomicIntegerFieldUpdater<T> {
     ctor protected AtomicIntegerFieldUpdater();
     method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator);
     method public int addAndGet(T, int);
@@ -61477,7 +61477,7 @@
     method public final int getAndUpdate(T, java.util.function.IntUnaryOperator);
     method public int incrementAndGet(T);
     method public abstract void lazySet(T, int);
-    method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+    method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
     method public abstract void set(T, int);
     method public final int updateAndGet(T, java.util.function.IntUnaryOperator);
     method public abstract boolean weakCompareAndSet(T, int, int);
@@ -61530,7 +61530,7 @@
     method public final boolean weakCompareAndSet(int, long, long);
   }
 
-  public abstract class AtomicLongFieldUpdater {
+  public abstract class AtomicLongFieldUpdater<T> {
     ctor protected AtomicLongFieldUpdater();
     method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator);
     method public long addAndGet(T, long);
@@ -61545,13 +61545,13 @@
     method public final long getAndUpdate(T, java.util.function.LongUnaryOperator);
     method public long incrementAndGet(T);
     method public abstract void lazySet(T, long);
-    method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+    method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
     method public abstract void set(T, long);
     method public final long updateAndGet(T, java.util.function.LongUnaryOperator);
     method public abstract boolean weakCompareAndSet(T, long, long);
   }
 
-  public class AtomicMarkableReference {
+  public class AtomicMarkableReference<V> {
     ctor public AtomicMarkableReference(V, boolean);
     method public boolean attemptMark(V, boolean);
     method public boolean compareAndSet(V, V, boolean, boolean);
@@ -61562,7 +61562,7 @@
     method public boolean weakCompareAndSet(V, V, boolean, boolean);
   }
 
-  public class AtomicReference implements java.io.Serializable {
+  public class AtomicReference<V> implements java.io.Serializable {
     ctor public AtomicReference(V);
     ctor public AtomicReference();
     method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>);
@@ -61577,7 +61577,7 @@
     method public final boolean weakCompareAndSet(V, V);
   }
 
-  public class AtomicReferenceArray implements java.io.Serializable {
+  public class AtomicReferenceArray<E> implements java.io.Serializable {
     ctor public AtomicReferenceArray(int);
     ctor public AtomicReferenceArray(E[]);
     method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>);
@@ -61593,7 +61593,7 @@
     method public final boolean weakCompareAndSet(int, E, E);
   }
 
-  public abstract class AtomicReferenceFieldUpdater {
+  public abstract class AtomicReferenceFieldUpdater<T, V> {
     ctor protected AtomicReferenceFieldUpdater();
     method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>);
     method public abstract boolean compareAndSet(T, V, V);
@@ -61602,13 +61602,13 @@
     method public V getAndSet(T, V);
     method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>);
     method public abstract void lazySet(T, V);
-    method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
+    method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
     method public abstract void set(T, V);
     method public final V updateAndGet(T, java.util.function.UnaryOperator<V>);
     method public abstract boolean weakCompareAndSet(T, V, V);
   }
 
-  public class AtomicStampedReference {
+  public class AtomicStampedReference<V> {
     ctor public AtomicStampedReference(V, int);
     method public boolean attemptStamp(V, int);
     method public boolean compareAndSet(V, V, int, int);
@@ -61911,33 +61911,33 @@
 
 package java.util.function {
 
-  public abstract interface BiConsumer {
+  public abstract interface BiConsumer<T, U> {
     method public abstract void accept(T, U);
     method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>);
   }
 
-  public abstract interface BiFunction {
-    method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
+  public abstract interface BiFunction<T, U, R> {
+    method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
     method public abstract R apply(T, U);
   }
 
-  public abstract interface BiPredicate {
+  public abstract interface BiPredicate<T, U> {
     method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>);
     method public default java.util.function.BiPredicate<T, U> negate();
     method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>);
     method public abstract boolean test(T, U);
   }
 
-  public abstract interface BinaryOperator implements java.util.function.BiFunction {
-    method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
-    method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
+  public abstract interface BinaryOperator<T> implements java.util.function.BiFunction {
+    method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
   }
 
   public abstract interface BooleanSupplier {
     method public abstract boolean getAsBoolean();
   }
 
-  public abstract interface Consumer {
+  public abstract interface Consumer<T> {
     method public abstract void accept(T);
     method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>);
   }
@@ -61951,7 +61951,7 @@
     method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
   }
 
-  public abstract interface DoubleFunction {
+  public abstract interface DoubleFunction<R> {
     method public abstract R apply(double);
   }
 
@@ -61981,11 +61981,11 @@
     method public static java.util.function.DoubleUnaryOperator identity();
   }
 
-  public abstract interface Function {
-    method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
+  public abstract interface Function<T, R> {
+    method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
     method public abstract R apply(T);
-    method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
-    method public static java.util.function.Function<T, T> identity();
+    method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
+    method public static <T> java.util.function.Function<T, T> identity();
   }
 
   public abstract interface IntBinaryOperator {
@@ -61997,7 +61997,7 @@
     method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
   }
 
-  public abstract interface IntFunction {
+  public abstract interface IntFunction<R> {
     method public abstract R apply(int);
   }
 
@@ -62036,7 +62036,7 @@
     method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
   }
 
-  public abstract interface LongFunction {
+  public abstract interface LongFunction<R> {
     method public abstract R apply(long);
   }
 
@@ -62066,56 +62066,56 @@
     method public static java.util.function.LongUnaryOperator identity();
   }
 
-  public abstract interface ObjDoubleConsumer {
+  public abstract interface ObjDoubleConsumer<T> {
     method public abstract void accept(T, double);
   }
 
-  public abstract interface ObjIntConsumer {
+  public abstract interface ObjIntConsumer<T> {
     method public abstract void accept(T, int);
   }
 
-  public abstract interface ObjLongConsumer {
+  public abstract interface ObjLongConsumer<T> {
     method public abstract void accept(T, long);
   }
 
-  public abstract interface Predicate {
+  public abstract interface Predicate<T> {
     method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>);
-    method public static java.util.function.Predicate<T> isEqual(java.lang.Object);
+    method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object);
     method public default java.util.function.Predicate<T> negate();
     method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>);
     method public abstract boolean test(T);
   }
 
-  public abstract interface Supplier {
+  public abstract interface Supplier<T> {
     method public abstract T get();
   }
 
-  public abstract interface ToDoubleBiFunction {
+  public abstract interface ToDoubleBiFunction<T, U> {
     method public abstract double applyAsDouble(T, U);
   }
 
-  public abstract interface ToDoubleFunction {
+  public abstract interface ToDoubleFunction<T> {
     method public abstract double applyAsDouble(T);
   }
 
-  public abstract interface ToIntBiFunction {
+  public abstract interface ToIntBiFunction<T, U> {
     method public abstract int applyAsInt(T, U);
   }
 
-  public abstract interface ToIntFunction {
+  public abstract interface ToIntFunction<T> {
     method public abstract int applyAsInt(T);
   }
 
-  public abstract interface ToLongBiFunction {
+  public abstract interface ToLongBiFunction<T, U> {
     method public abstract long applyAsLong(T, U);
   }
 
-  public abstract interface ToLongFunction {
+  public abstract interface ToLongFunction<T> {
     method public abstract long applyAsLong(T);
   }
 
-  public abstract interface UnaryOperator implements java.util.function.Function {
-    method public static java.util.function.UnaryOperator<T> identity();
+  public abstract interface UnaryOperator<T> implements java.util.function.Function {
+    method public static <T> java.util.function.UnaryOperator<T> identity();
   }
 
 }
@@ -62703,7 +62703,7 @@
 
 package java.util.stream {
 
-  public abstract interface BaseStream implements java.lang.AutoCloseable {
+  public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable {
     method public abstract void close();
     method public abstract boolean isParallel();
     method public abstract java.util.Iterator<T> iterator();
@@ -62714,13 +62714,13 @@
     method public abstract S unordered();
   }
 
-  public abstract interface Collector {
+  public abstract interface Collector<T, A, R> {
     method public abstract java.util.function.BiConsumer<A, T> accumulator();
     method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics();
     method public abstract java.util.function.BinaryOperator<A> combiner();
     method public abstract java.util.function.Function<A, R> finisher();
-    method public static java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
-    method public static java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
+    method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
+    method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
     method public abstract java.util.function.Supplier<A> supplier();
   }
 
@@ -62733,43 +62733,43 @@
   }
 
   public final class Collectors {
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Long> counting();
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting();
+    method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
+    method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
+    method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining();
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence);
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence);
-    method public static java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
-    method public static java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
-    method public static java.util.stream.Collector<T, ?, java.util.List<T>> toList();
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
-    method public static java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
+    method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
+    method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
+    method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList();
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
   }
 
   public abstract interface DoubleStream implements java.util.stream.BaseStream {
@@ -62778,7 +62778,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Double> boxed();
     method public static java.util.stream.DoubleStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
     method public abstract long count();
     method public abstract java.util.stream.DoubleStream distinct();
@@ -62796,7 +62796,7 @@
     method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
     method public abstract java.util.OptionalDouble max();
     method public abstract java.util.OptionalDouble min();
     method public abstract boolean noneMatch(java.util.function.DoublePredicate);
@@ -62829,7 +62829,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Integer> boxed();
     method public static java.util.stream.IntStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
     method public abstract long count();
     method public abstract java.util.stream.IntStream distinct();
@@ -62847,7 +62847,7 @@
     method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
     method public abstract java.util.OptionalInt max();
     method public abstract java.util.OptionalInt min();
     method public abstract boolean noneMatch(java.util.function.IntPredicate);
@@ -62881,7 +62881,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Long> boxed();
     method public static java.util.stream.LongStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
     method public abstract long count();
     method public abstract java.util.stream.LongStream distinct();
@@ -62899,7 +62899,7 @@
     method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
     method public abstract java.util.OptionalLong max();
     method public abstract java.util.OptionalLong min();
     method public abstract boolean noneMatch(java.util.function.LongPredicate);
@@ -62926,49 +62926,49 @@
     method public abstract java.util.stream.LongStream build();
   }
 
-  public abstract interface Stream implements java.util.stream.BaseStream {
+  public abstract interface Stream<T> implements java.util.stream.BaseStream {
     method public abstract boolean allMatch(java.util.function.Predicate<? super T>);
     method public abstract boolean anyMatch(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Stream.Builder<T> builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
-    method public abstract R collect(java.util.stream.Collector<? super T, A, R>);
-    method public static java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
+    method public static <T> java.util.stream.Stream.Builder<T> builder();
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>);
+    method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
     method public abstract long count();
     method public abstract java.util.stream.Stream<T> distinct();
-    method public static java.util.stream.Stream<T> empty();
+    method public static <T> java.util.stream.Stream<T> empty();
     method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>);
     method public abstract java.util.Optional<T> findAny();
     method public abstract java.util.Optional<T> findFirst();
-    method public abstract java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
+    method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
     method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>);
     method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>);
     method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>);
     method public abstract void forEach(java.util.function.Consumer<? super T>);
     method public abstract void forEachOrdered(java.util.function.Consumer<? super T>);
-    method public static java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
-    method public static java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
+    method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
+    method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
     method public abstract java.util.stream.Stream<T> limit(long);
-    method public abstract java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
+    method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>);
     method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>);
     method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>);
     method public abstract boolean noneMatch(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Stream<T> of(T);
-    method public static java.util.stream.Stream<T> of(T...);
+    method public static <T> java.util.stream.Stream<T> of(T);
+    method public static <T> java.util.stream.Stream<T> of(T...);
     method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>);
     method public abstract T reduce(T, java.util.function.BinaryOperator<T>);
     method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>);
-    method public abstract U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
+    method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
     method public abstract java.util.stream.Stream<T> skip(long);
     method public abstract java.util.stream.Stream<T> sorted();
     method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>);
     method public abstract java.lang.Object[] toArray();
-    method public abstract A[] toArray(java.util.function.IntFunction<A[]>);
+    method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>);
   }
 
-  public static abstract interface Stream.Builder implements java.util.function.Consumer {
+  public static abstract interface Stream.Builder<T> implements java.util.function.Consumer {
     method public abstract void accept(T);
     method public default java.util.stream.Stream.Builder<T> add(T);
     method public abstract java.util.stream.Stream<T> build();
@@ -62981,8 +62981,8 @@
     method public static java.util.stream.IntStream intStream(java.util.function.Supplier<? extends java.util.Spliterator.OfInt>, int, boolean);
     method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean);
     method public static java.util.stream.LongStream longStream(java.util.function.Supplier<? extends java.util.Spliterator.OfLong>, int, boolean);
-    method public static java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean);
-    method public static java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean);
+    method public static <T> java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean);
+    method public static <T> java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean);
   }
 
 }
@@ -65155,16 +65155,16 @@
   public final class Subject implements java.io.Serializable {
     ctor public Subject();
     ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>);
-    method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>);
-    method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
-    method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
-    method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
+    method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>);
+    method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
+    method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
     method public java.util.Set<java.security.Principal> getPrincipals();
-    method public java.util.Set<T> getPrincipals(java.lang.Class<T>);
+    method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>);
     method public java.util.Set<java.lang.Object> getPrivateCredentials();
-    method public java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
+    method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
     method public java.util.Set<java.lang.Object> getPublicCredentials();
-    method public java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
+    method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
     method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
     method public boolean isReadOnly();
     method public void setReadOnly();
diff --git a/api/system-current.txt b/api/system-current.txt
index ca1c61d..8866f1c 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -3036,11 +3036,11 @@
     field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
   }
 
-  public abstract interface AccountManagerCallback {
+  public abstract interface AccountManagerCallback<V> {
     method public abstract void run(android.accounts.AccountManagerFuture<V>);
   }
 
-  public abstract interface AccountManagerFuture {
+  public abstract interface AccountManagerFuture<V> {
     method public abstract boolean cancel(boolean);
     method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
     method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
@@ -3186,7 +3186,7 @@
     method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);
   }
 
-  public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter {
+  public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter {
     ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>);
     method public abstract T convertBack(V);
     method public android.animation.BidirectionalTypeConverter<V, T> invert();
@@ -3278,26 +3278,26 @@
     method public java.lang.String getPropertyName();
     method public java.lang.Object getTarget();
     method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
-    method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
+    method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
     method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...);
     method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
-    method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
+    method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
+    method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...);
     method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
-    method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
+    method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
+    method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]);
     method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
+    method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
     method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]);
     method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
+    method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
     method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
     method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+    method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
     method public void setAutoCancel(boolean);
     method public void setProperty(android.util.Property);
@@ -3321,17 +3321,17 @@
     method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
     method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+    method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
     method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+    method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
     method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+    method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
+    method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
     method public void setConverter(android.animation.TypeConverter);
     method public void setEvaluator(android.animation.TypeEvaluator);
     method public void setFloatValues(float...);
@@ -3368,12 +3368,12 @@
     method public abstract float getInterpolation(float);
   }
 
-  public abstract class TypeConverter {
+  public abstract class TypeConverter<T, V> {
     ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>);
     method public abstract V convert(T);
   }
 
-  public abstract interface TypeEvaluator {
+  public abstract interface TypeEvaluator<T> {
     method public abstract T evaluate(float, T, T);
   }
 
@@ -4733,7 +4733,7 @@
     method public android.os.Parcelable saveAllState();
   }
 
-  public abstract class FragmentHostCallback extends android.app.FragmentContainer {
+  public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer {
     ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
     method public void onAttachFragment(android.app.Fragment);
     method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
@@ -5000,12 +5000,12 @@
     method public abstract void destroyLoader(int);
     method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
     method public static void enableDebugLogging(boolean);
-    method public abstract android.content.Loader<D> getLoader(int);
-    method public abstract android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.content.Loader<D> getLoader(int);
+    method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
   }
 
-  public static abstract interface LoaderManager.LoaderCallbacks {
+  public static abstract interface LoaderManager.LoaderCallbacks<D> {
     method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle);
     method public abstract void onLoadFinished(android.content.Loader<D>, D);
     method public abstract void onLoaderReset(android.content.Loader<D>);
@@ -7998,7 +7998,7 @@
     ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper);
   }
 
-  public abstract class AsyncTaskLoader extends android.content.Loader {
+  public abstract class AsyncTaskLoader<D> extends android.content.Loader {
     ctor public AsyncTaskLoader(android.content.Context);
     method public void cancelLoadInBackground();
     method public boolean isLoadInBackgroundCanceled();
@@ -8180,7 +8180,7 @@
     method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
     method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
-    method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
+    method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
@@ -8193,7 +8193,7 @@
     method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
   }
 
-  public static abstract interface ContentProvider.PipeDataWriter {
+  public static abstract interface ContentProvider.PipeDataWriter<T> {
     method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T);
   }
 
@@ -8466,7 +8466,7 @@
     method public final java.lang.String getString(int);
     method public final java.lang.String getString(int, java.lang.Object...);
     method public abstract java.lang.Object getSystemService(java.lang.String);
-    method public final T getSystemService(java.lang.Class<T>);
+    method public final <T> T getSystemService(java.lang.Class<T>);
     method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>);
     method public final java.lang.CharSequence getText(int);
     method public abstract android.content.res.Resources.Theme getTheme();
@@ -8837,8 +8837,8 @@
     method public long getLongExtra(java.lang.String, long);
     method public java.lang.String getPackage();
     method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
-    method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
-    method public T getParcelableExtra(java.lang.String);
+    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
+    method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String);
     method public java.lang.String getScheme();
     method public android.content.Intent getSelector();
     method public java.io.Serializable getSerializableExtra(java.lang.String);
@@ -9325,7 +9325,7 @@
     ctor public IntentSender.SendIntentException(java.lang.Exception);
   }
 
-  public class Loader {
+  public class Loader<D> {
     ctor public Loader(android.content.Context);
     method public void abandon();
     method public boolean cancelLoad();
@@ -9362,11 +9362,11 @@
     ctor public Loader.ForceLoadContentObserver();
   }
 
-  public static abstract interface Loader.OnLoadCanceledListener {
+  public static abstract interface Loader.OnLoadCanceledListener<D> {
     method public abstract void onLoadCanceled(android.content.Loader<D>);
   }
 
-  public static abstract interface Loader.OnLoadCompleteListener {
+  public static abstract interface Loader.OnLoadCompleteListener<D> {
     method public abstract void onLoadComplete(android.content.Loader<D>, D);
   }
 
@@ -11335,7 +11335,7 @@
     method public boolean isNull(int);
   }
 
-  public abstract class Observable {
+  public abstract class Observable<T> {
     ctor public Observable();
     method public void registerObserver(T);
     method public void unregisterAll();
@@ -13226,7 +13226,7 @@
   public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable {
     ctor public AnimatedStateListDrawable();
     method public void addState(int[], android.graphics.drawable.Drawable, int);
-    method public void addTransition(int, int, T, boolean);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
   }
 
   public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 {
@@ -14359,7 +14359,7 @@
   }
 
   public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata {
-    method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
+    method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
     method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
     method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
     field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
@@ -14444,7 +14444,7 @@
     field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS;
   }
 
-  public static final class CameraCharacteristics.Key {
+  public static final class CameraCharacteristics.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
@@ -14509,7 +14509,7 @@
     method public void onTorchModeUnavailable(java.lang.String);
   }
 
-  public abstract class CameraMetadata {
+  public abstract class CameraMetadata<TKey> {
     method public java.util.List<TKey> getKeys();
     field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1
     field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2
@@ -14717,7 +14717,7 @@
 
   public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
     method public int describeContents();
-    method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
     method public java.lang.Object getTag();
     method public boolean isReprocess();
     method public void writeToParcel(android.os.Parcel, int);
@@ -14780,20 +14780,20 @@
   public static final class CaptureRequest.Builder {
     method public void addTarget(android.view.Surface);
     method public android.hardware.camera2.CaptureRequest build();
-    method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
     method public void removeTarget(android.view.Surface);
-    method public void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
+    method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
     method public void setTag(java.lang.Object);
   }
 
-  public static final class CaptureRequest.Key {
+  public static final class CaptureRequest.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
   }
 
   public class CaptureResult extends android.hardware.camera2.CameraMetadata {
-    method public T get(android.hardware.camera2.CaptureResult.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
     method public long getFrameNumber();
     method public android.hardware.camera2.CaptureRequest getRequest();
     method public int getSequenceId();
@@ -14874,7 +14874,7 @@
     field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
   }
 
-  public static final class CaptureResult.Key {
+  public static final class CaptureResult.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
@@ -15008,14 +15008,14 @@
     method public android.util.Size[] getInputSizes(int);
     method public final int[] getOutputFormats();
     method public long getOutputMinFrameDuration(int, android.util.Size);
-    method public long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
-    method public android.util.Size[] getOutputSizes(java.lang.Class<T>);
+    method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
+    method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>);
     method public android.util.Size[] getOutputSizes(int);
     method public long getOutputStallDuration(int, android.util.Size);
-    method public long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
+    method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
     method public final int[] getValidOutputFormatsForInput(int);
     method public boolean isOutputSupportedFor(int);
-    method public static boolean isOutputSupportedFor(java.lang.Class<T>);
+    method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>);
     method public boolean isOutputSupportedFor(android.view.Surface);
   }
 
@@ -17464,7 +17464,7 @@
 
 package android.icu.text {
 
-  public final class AlphabeticIndex implements java.lang.Iterable {
+  public final class AlphabeticIndex<V> implements java.lang.Iterable {
     ctor public AlphabeticIndex(android.icu.util.ULocale);
     ctor public AlphabeticIndex(java.util.Locale);
     ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator);
@@ -17490,7 +17490,7 @@
     method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String);
   }
 
-  public static class AlphabeticIndex.Bucket implements java.lang.Iterable {
+  public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable {
     method public java.lang.String getLabel();
     method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType();
     method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator();
@@ -17506,14 +17506,14 @@
     enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW;
   }
 
-  public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable {
+  public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable {
     method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int);
     method public int getBucketCount();
     method public int getBucketIndex(java.lang.CharSequence);
     method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
   }
 
-  public static class AlphabeticIndex.Record {
+  public static class AlphabeticIndex.Record<V> {
     method public V getData();
     method public java.lang.CharSequence getName();
   }
@@ -19026,8 +19026,8 @@
     method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet);
     method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>);
-    method public android.icu.text.UnicodeSet addAll(T...);
-    method public T addAllTo(T);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...);
+    method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T);
     method public void addMatchSetTo(android.icu.text.UnicodeSet);
     method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int);
     method public final android.icu.text.UnicodeSet applyPattern(java.lang.String);
@@ -19055,15 +19055,15 @@
     method public final boolean contains(java.lang.CharSequence);
     method public boolean containsAll(android.icu.text.UnicodeSet);
     method public boolean containsAll(java.lang.String);
-    method public boolean containsAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>);
     method public boolean containsNone(int, int);
     method public boolean containsNone(android.icu.text.UnicodeSet);
     method public boolean containsNone(java.lang.CharSequence);
-    method public boolean containsNone(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>);
     method public final boolean containsSome(int, int);
     method public final boolean containsSome(android.icu.text.UnicodeSet);
     method public final boolean containsSome(java.lang.CharSequence);
-    method public final boolean containsSome(java.lang.Iterable<T>);
+    method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>);
     method public android.icu.text.UnicodeSet freeze();
     method public static android.icu.text.UnicodeSet from(java.lang.CharSequence);
     method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence);
@@ -19081,14 +19081,14 @@
     method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence);
     method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet);
-    method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
     method public final android.icu.text.UnicodeSet removeAllStrings();
     method public android.icu.text.UnicodeSet retain(int, int);
     method public final android.icu.text.UnicodeSet retain(int);
     method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence);
     method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet);
-    method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
     method public android.icu.text.UnicodeSet set(int, int);
     method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet);
     method public int size();
@@ -19498,7 +19498,7 @@
     method public long getToDate();
   }
 
-  public abstract interface Freezable implements java.lang.Cloneable {
+  public abstract interface Freezable<T> implements java.lang.Cloneable {
     method public abstract T cloneAsThawed();
     method public abstract T freeze();
     method public abstract boolean isFrozen();
@@ -19780,7 +19780,7 @@
     field public static final android.icu.util.TimeUnit YEAR;
   }
 
-  public class Output {
+  public class Output<T> {
     ctor public Output();
     ctor public Output(T);
     field public T value;
@@ -30754,7 +30754,7 @@
 
 package android.os {
 
-  public abstract class AsyncTask {
+  public abstract class AsyncTask<Params, Progress, Result> {
     ctor public AsyncTask();
     method public final boolean cancel(boolean);
     method protected abstract Result doInBackground(Params...);
@@ -30984,16 +30984,16 @@
     method public float getFloat(java.lang.String, float);
     method public float[] getFloatArray(java.lang.String);
     method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String);
-    method public T getParcelable(java.lang.String);
+    method public <T extends android.os.Parcelable> T getParcelable(java.lang.String);
     method public android.os.Parcelable[] getParcelableArray(java.lang.String);
-    method public java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
+    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
     method public java.io.Serializable getSerializable(java.lang.String);
     method public short getShort(java.lang.String);
     method public short getShort(java.lang.String, short);
     method public short[] getShortArray(java.lang.String);
     method public android.util.Size getSize(java.lang.String);
     method public android.util.SizeF getSizeF(java.lang.String);
-    method public android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
+    method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
     method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
     method public boolean hasFileDescriptors();
     method public void putAll(android.os.Bundle);
@@ -31498,8 +31498,8 @@
     method public final long[] createLongArray();
     method public final java.lang.String[] createStringArray();
     method public final java.util.ArrayList<java.lang.String> createStringArrayList();
-    method public final T[] createTypedArray(android.os.Parcelable.Creator<T>);
-    method public final java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
+    method public final <T> T[] createTypedArray(android.os.Parcelable.Creator<T>);
+    method public final <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
     method public final int dataAvail();
     method public final int dataCapacity();
     method public final int dataPosition();
@@ -31532,7 +31532,7 @@
     method public final long readLong();
     method public final void readLongArray(long[]);
     method public final void readMap(java.util.Map, java.lang.ClassLoader);
-    method public final T readParcelable(java.lang.ClassLoader);
+    method public final <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader);
     method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
     method public final android.os.PersistableBundle readPersistableBundle();
     method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
@@ -31545,9 +31545,9 @@
     method public final void readStringArray(java.lang.String[]);
     method public final void readStringList(java.util.List<java.lang.String>);
     method public final android.os.IBinder readStrongBinder();
-    method public final void readTypedArray(T[], android.os.Parcelable.Creator<T>);
-    method public final void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
-    method public final T readTypedObject(android.os.Parcelable.Creator<T>);
+    method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
+    method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
+    method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>);
     method public final java.lang.Object readValue(java.lang.ClassLoader);
     method public final void recycle();
     method public final void setDataCapacity(int);
@@ -31578,7 +31578,7 @@
     method public final void writeMap(java.util.Map);
     method public final void writeNoException();
     method public final void writeParcelable(android.os.Parcelable, int);
-    method public final void writeParcelableArray(T[], int);
+    method public final <T extends android.os.Parcelable> void writeParcelableArray(T[], int);
     method public final void writePersistableBundle(android.os.PersistableBundle);
     method public final void writeSerializable(java.io.Serializable);
     method public final void writeSize(android.util.Size);
@@ -31590,9 +31590,9 @@
     method public final void writeStringList(java.util.List<java.lang.String>);
     method public final void writeStrongBinder(android.os.IBinder);
     method public final void writeStrongInterface(android.os.IInterface);
-    method public final void writeTypedArray(T[], int);
-    method public final void writeTypedList(java.util.List<T>);
-    method public final void writeTypedObject(T, int);
+    method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int);
+    method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
+    method public final <T extends android.os.Parcelable> void writeTypedObject(T, int);
     method public final void writeValue(java.lang.Object);
     field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
   }
@@ -31670,11 +31670,11 @@
     field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
   }
 
-  public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator {
+  public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator {
     method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
   }
 
-  public static abstract interface Parcelable.Creator {
+  public static abstract interface Parcelable.Creator<T> {
     method public abstract T createFromParcel(android.os.Parcel);
     method public abstract T[] newArray(int);
   }
@@ -31817,7 +31817,7 @@
     method public abstract void onResult(android.os.Bundle);
   }
 
-  public class RemoteCallbackList {
+  public class RemoteCallbackList<E extends android.os.IInterface> {
     ctor public RemoteCallbackList();
     method public int beginBroadcast();
     method public void finishBroadcast();
@@ -37384,7 +37384,7 @@
     field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService";
   }
 
-  public static abstract interface CarrierMessagingService.ResultCallback {
+  public static abstract interface CarrierMessagingService.ResultCallback<T> {
     method public abstract void onReceiveResult(T) throws android.os.RemoteException;
   }
 
@@ -37536,7 +37536,7 @@
     field public static final java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
   }
 
-  public class MediaBrowserService.Result {
+  public class MediaBrowserService.Result<T> {
     method public void detach();
     method public void sendResult(T);
   }
@@ -40872,14 +40872,14 @@
 
 package android.test {
 
-  public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>);
     ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean);
     method public T getActivity();
     method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
   }
 
-  public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>);
     ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>);
     method public T getActivity();
@@ -40894,7 +40894,7 @@
     method protected void setActivity(android.app.Activity);
   }
 
-  public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public ActivityUnitTestCase(java.lang.Class<T>);
     method public T getActivity();
     method public int getFinishedActivityRequest();
@@ -40940,7 +40940,7 @@
     method public void testStarted(java.lang.String);
   }
 
-  public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase {
+  public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
     ctor public ApplicationTestCase(java.lang.Class<T>);
     method protected final void createApplication();
     method public T getApplication();
@@ -40966,8 +40966,8 @@
     method public android.app.Instrumentation getInstrumentation();
     method public deprecated void injectInsrumentation(android.app.Instrumentation);
     method public void injectInstrumentation(android.app.Instrumentation);
-    method public final T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
-    method public final T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
+    method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
+    method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
     method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable;
     method public void sendKeys(java.lang.String);
     method public void sendKeys(int...);
@@ -41007,7 +41007,7 @@
 
   public class LoaderTestCase extends android.test.AndroidTestCase {
     ctor public LoaderTestCase();
-    method public T getLoaderResultSynchronously(android.content.Loader<T>);
+    method public <T> T getLoaderResultSynchronously(android.content.Loader<T>);
   }
 
   public final deprecated class MoreAsserts {
@@ -41062,20 +41062,20 @@
     method public abstract void startTiming(boolean);
   }
 
-  public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase {
+  public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
     ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String);
     method public android.test.mock.MockContentResolver getMockContentResolver();
     method public android.test.IsolatedContext getMockContext();
     method public T getProvider();
-    method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
-  public abstract class ProviderTestCase2 extends android.test.AndroidTestCase {
+  public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase {
     ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String);
     method public android.test.mock.MockContentResolver getMockContentResolver();
     method public android.test.IsolatedContext getMockContext();
     method public T getProvider();
-    method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
   public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper {
@@ -41083,11 +41083,11 @@
     ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String);
     method public java.lang.String getDatabasePrefix();
     method public void makeExistingFilesAndDbsAccessible();
-    method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
-    method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
-  public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase {
+  public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
     ctor public ServiceTestCase(java.lang.Class<T>);
     method protected android.os.IBinder bindService(android.content.Intent);
     method public android.app.Application getApplication();
@@ -41100,7 +41100,7 @@
     method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
   }
 
-  public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase {
+  public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
     ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>);
     method public T getActivity();
     method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
@@ -41468,7 +41468,7 @@
     ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
     ctor public TestMethod(junit.framework.TestCase);
     method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass();
     method public java.lang.String getEnclosingClassname();
     method public java.lang.String getName();
@@ -41916,7 +41916,7 @@
     method public int getSpanEnd(java.lang.Object);
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
-    method public T[] getSpans(int, int, java.lang.Class<T>);
+    method public <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint);
     method public int getTextWatcherDepth();
     method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int);
@@ -41938,7 +41938,7 @@
     method public int getSpanEnd(java.lang.Object);
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
-    method public T[] getSpans(int, int, java.lang.Class<T>);
+    method public <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public final int length();
     method public int nextSpanTransition(int, int, java.lang.Class);
     method public final java.lang.String toString();
@@ -41948,7 +41948,7 @@
     method public abstract int getSpanEnd(java.lang.Object);
     method public abstract int getSpanFlags(java.lang.Object);
     method public abstract int getSpanStart(java.lang.Object);
-    method public abstract T[] getSpans(int, int, java.lang.Class<T>);
+    method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public abstract int nextSpanTransition(int, int, java.lang.Class);
     field public static final int SPAN_COMPOSING = 256; // 0x100
     field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21
@@ -42926,7 +42926,7 @@
     field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
   }
 
-  public static class TtsSpan.Builder {
+  public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> {
     ctor public TtsSpan.Builder(java.lang.String);
     method public android.text.style.TtsSpan build();
     method public C setIntArgument(java.lang.String, int);
@@ -43022,7 +43022,7 @@
     method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String);
   }
 
-  public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder {
+  public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder {
     ctor public TtsSpan.SemioticClassBuilder(java.lang.String);
     method public C setAnimacy(java.lang.String);
     method public C setCase(java.lang.String);
@@ -43429,7 +43429,7 @@
     ctor public AndroidRuntimeException(java.lang.Exception);
   }
 
-  public final class ArrayMap implements java.util.Map {
+  public final class ArrayMap<K, V> implements java.util.Map {
     ctor public ArrayMap();
     ctor public ArrayMap(int);
     ctor public ArrayMap(android.util.ArrayMap<K, V>);
@@ -43457,7 +43457,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public final class ArraySet implements java.util.Collection java.util.Set {
+  public final class ArraySet<E> implements java.util.Collection java.util.Set {
     ctor public ArraySet();
     ctor public ArraySet(int);
     ctor public ArraySet(android.util.ArraySet<E>);
@@ -43478,7 +43478,7 @@
     method public boolean retainAll(java.util.Collection<?>);
     method public int size();
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
     method public E valueAt(int);
   }
 
@@ -43623,13 +43623,13 @@
   public deprecated class FloatMath {
   }
 
-  public abstract class FloatProperty extends android.util.Property {
+  public abstract class FloatProperty<T> extends android.util.Property {
     ctor public FloatProperty(java.lang.String);
     method public final void set(T, java.lang.Float);
     method public abstract void setValue(T, float);
   }
 
-  public abstract class IntProperty extends android.util.Property {
+  public abstract class IntProperty<T> extends android.util.Property {
     ctor public IntProperty(java.lang.String);
     method public final void set(T, java.lang.Integer);
     method public abstract void setValue(T, int);
@@ -43729,7 +43729,7 @@
     method public void println(java.lang.String);
   }
 
-  public class LongSparseArray implements java.lang.Cloneable {
+  public class LongSparseArray<E> implements java.lang.Cloneable {
     ctor public LongSparseArray();
     ctor public LongSparseArray(int);
     method public void append(long, E);
@@ -43750,7 +43750,7 @@
     method public E valueAt(int);
   }
 
-  public class LruCache {
+  public class LruCache<K, V> {
     ctor public LruCache(int);
     method protected V create(K);
     method public final synchronized int createCount();
@@ -43838,9 +43838,9 @@
     ctor public NoSuchPropertyException(java.lang.String);
   }
 
-  public class Pair {
+  public class Pair<F, S> {
     ctor public Pair(F, S);
-    method public static android.util.Pair<A, B> create(A, B);
+    method public static <A, B> android.util.Pair<A, B> create(A, B);
     field public final F first;
     field public final S second;
   }
@@ -43873,22 +43873,22 @@
     method public abstract void println(java.lang.String);
   }
 
-  public abstract class Property {
+  public abstract class Property<T, V> {
     ctor public Property(java.lang.Class<V>, java.lang.String);
     method public abstract V get(T);
     method public java.lang.String getName();
     method public java.lang.Class<V> getType();
     method public boolean isReadOnly();
-    method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
+    method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
     method public void set(T, V);
   }
 
-  public final class Range {
+  public final class Range<T extends java.lang.Comparable<? super T>> {
     ctor public Range(T, T);
     method public T clamp(T);
     method public boolean contains(T);
     method public boolean contains(android.util.Range<T>);
-    method public static android.util.Range<T> create(T, T);
+    method public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> create(T, T);
     method public android.util.Range<T> extend(android.util.Range<T>);
     method public android.util.Range<T> extend(T, T);
     method public android.util.Range<T> extend(T);
@@ -43932,7 +43932,7 @@
     method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException;
   }
 
-  public class SparseArray implements java.lang.Cloneable {
+  public class SparseArray<E> implements java.lang.Cloneable {
     ctor public SparseArray();
     ctor public SparseArray(int);
     method public void append(int, E);
@@ -48743,7 +48743,7 @@
     method public static java.lang.String stripAnchor(java.lang.String);
   }
 
-  public abstract interface ValueCallback {
+  public abstract interface ValueCallback<T> {
     method public abstract void onReceiveValue(T);
   }
 
@@ -49758,7 +49758,7 @@
     field public static final int NO_SELECTION = -2147483648; // 0x80000000
   }
 
-  public abstract class AdapterView extends android.view.ViewGroup {
+  public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup {
     ctor public AdapterView(android.content.Context);
     ctor public AdapterView(android.content.Context, android.util.AttributeSet);
     ctor public AdapterView(android.content.Context, android.util.AttributeSet, int);
@@ -49881,7 +49881,7 @@
     ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
   }
 
-  public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
+  public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
     ctor public ArrayAdapter(android.content.Context, int);
     ctor public ArrayAdapter(android.content.Context, int, int);
     ctor public ArrayAdapter(android.content.Context, int, T[]);
@@ -49942,7 +49942,7 @@
     method protected void performFiltering(java.lang.CharSequence, int);
     method public void performValidation();
     method protected void replaceText(java.lang.CharSequence);
-    method public void setAdapter(T);
+    method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T);
     method public void setCompletionHint(java.lang.CharSequence);
     method public void setDropDownAnchor(int);
     method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -52228,7 +52228,7 @@
 
 package com.android.internal.util {
 
-  public abstract interface Predicate {
+  public abstract interface Predicate<T> {
     method public abstract boolean apply(T);
   }
 
@@ -54300,22 +54300,22 @@
     enum_constant public static final java.lang.Character.UnicodeScript YI;
   }
 
-  public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
-    method public java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
+  public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
+    method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
     method public T cast(java.lang.Object);
     method public boolean desiredAssertionStatus();
     method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException;
     method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException;
-    method public A getAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getAnnotations();
-    method public A[] getAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
     method public java.lang.String getCanonicalName();
     method public java.lang.ClassLoader getClassLoader();
     method public java.lang.Class<?>[] getClasses();
     method public java.lang.Class<?> getComponentType();
     method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
     method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
-    method public A getDeclaredAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public java.lang.Class<?>[] getDeclaredClasses();
     method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
@@ -54427,7 +54427,7 @@
   public abstract interface Cloneable {
   }
 
-  public abstract interface Comparable {
+  public abstract interface Comparable<T> {
     method public abstract int compareTo(T);
   }
 
@@ -54481,7 +54481,7 @@
     field public static final java.lang.Class<java.lang.Double> TYPE;
   }
 
-  public abstract class Enum implements java.lang.Comparable java.io.Serializable {
+  public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable {
     ctor protected Enum(java.lang.String, int);
     method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException;
     method public final int compareTo(E);
@@ -54491,7 +54491,7 @@
     method public final int hashCode();
     method public final java.lang.String name();
     method public final int ordinal();
-    method public static T valueOf(java.lang.Class<T>, java.lang.String);
+    method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String);
   }
 
   public class EnumConstantNotPresentException extends java.lang.RuntimeException {
@@ -54610,7 +54610,7 @@
     ctor public IndexOutOfBoundsException(java.lang.String);
   }
 
-  public class InheritableThreadLocal extends java.lang.ThreadLocal {
+  public class InheritableThreadLocal<T> extends java.lang.ThreadLocal {
     ctor public InheritableThreadLocal();
     method protected T childValue(T);
   }
@@ -54689,7 +54689,7 @@
     ctor public InterruptedException(java.lang.String);
   }
 
-  public abstract interface Iterable {
+  public abstract interface Iterable<T> {
     method public default void forEach(java.util.function.Consumer<? super T>);
     method public abstract java.util.Iterator<T> iterator();
     method public default java.util.Spliterator<T> spliterator();
@@ -54904,12 +54904,12 @@
   }
 
   public class Package implements java.lang.reflect.AnnotatedElement {
-    method public A getAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getAnnotations();
-    method public A[] getAnnotationsByType(java.lang.Class<A>);
-    method public A getDeclaredAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
     method public java.lang.String getImplementationTitle();
     method public java.lang.String getImplementationVendor();
     method public java.lang.String getImplementationVersion();
@@ -55508,13 +55508,13 @@
     method public void uncaughtException(java.lang.Thread, java.lang.Throwable);
   }
 
-  public class ThreadLocal {
+  public class ThreadLocal<T> {
     ctor public ThreadLocal();
     method public T get();
     method protected T initialValue();
     method public void remove();
     method public void set(T);
-    method public static java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
+    method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
   }
 
   public class Throwable implements java.io.Serializable {
@@ -55652,30 +55652,30 @@
 
 package java.lang.ref {
 
-  public class PhantomReference extends java.lang.ref.Reference {
+  public class PhantomReference<T> extends java.lang.ref.Reference {
     ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
 
-  public abstract class Reference {
+  public abstract class Reference<T> {
     method public void clear();
     method public boolean enqueue();
     method public T get();
     method public boolean isEnqueued();
   }
 
-  public class ReferenceQueue {
+  public class ReferenceQueue<T> {
     ctor public ReferenceQueue();
     method public java.lang.ref.Reference<? extends T> poll();
     method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException;
     method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException;
   }
 
-  public class SoftReference extends java.lang.ref.Reference {
+  public class SoftReference<T> extends java.lang.ref.Reference {
     ctor public SoftReference(T);
     ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
 
-  public class WeakReference extends java.lang.ref.Reference {
+  public class WeakReference<T> extends java.lang.ref.Reference {
     ctor public WeakReference(T);
     ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
@@ -55686,7 +55686,7 @@
 
   public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
     ctor protected AccessibleObject();
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.annotation.Annotation[] getAnnotations();
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public boolean isAccessible();
@@ -55695,12 +55695,12 @@
   }
 
   public abstract interface AnnotatedElement {
-    method public abstract T getAnnotation(java.lang.Class<T>);
+    method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public abstract java.lang.annotation.Annotation[] getAnnotations();
-    method public default T[] getAnnotationsByType(java.lang.Class<T>);
-    method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
     method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public default T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
     method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
   }
 
@@ -55728,7 +55728,7 @@
     method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
   }
 
-  public final class Constructor extends java.lang.reflect.Executable {
+  public final class Constructor<T> extends java.lang.reflect.Executable {
     method public java.lang.Class<T> getDeclaringClass();
     method public java.lang.Class<?>[] getExceptionTypes();
     method public int getModifiers();
@@ -55876,7 +55876,7 @@
   }
 
   public final class Parameter implements java.lang.reflect.AnnotatedElement {
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.annotation.Annotation[] getAnnotations();
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public java.lang.reflect.Executable getDeclaringExecutable();
@@ -55913,7 +55913,7 @@
   public abstract interface Type {
   }
 
-  public abstract interface TypeVariable implements java.lang.reflect.Type {
+  public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type {
     method public abstract java.lang.reflect.Type[] getBounds();
     method public abstract D getGenericDeclaration();
     method public abstract java.lang.String getName();
@@ -56702,7 +56702,7 @@
     method public abstract java.net.SocketImpl createSocketImpl();
   }
 
-  public abstract interface SocketOption {
+  public abstract interface SocketOption<T> {
     method public abstract java.lang.String name();
     method public abstract java.lang.Class<T> type();
   }
@@ -57234,9 +57234,9 @@
   }
 
   public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel {
-    method public abstract void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
-    method public abstract void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
   }
 
@@ -57264,25 +57264,25 @@
   public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel {
     ctor protected AsynchronousFileChannel();
     method public abstract void force(boolean) throws java.io.IOException;
-    method public abstract void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
-    method public final void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+    method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+    method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
     method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean);
     method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock();
     method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
-    method public abstract void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long);
     method public abstract long size() throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException;
     method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException;
     method public final java.nio.channels.FileLock tryLock() throws java.io.IOException;
-    method public abstract void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long);
   }
 
   public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel {
     ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
-    method public abstract void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
+    method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
     method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept();
     method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
@@ -57290,30 +57290,30 @@
     method public static java.nio.channels.AsynchronousServerSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousServerSocketChannel open() throws java.io.IOException;
     method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
-    method public abstract java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
   }
 
   public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel {
     ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
     method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
-    method public abstract void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
+    method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress);
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
     method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException;
     method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException;
     method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
-    method public abstract void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
-    method public final void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
-    method public abstract void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
-    method public abstract java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+    method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException;
-    method public abstract void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
-    method public final void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
-    method public abstract void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
   }
 
   public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel {
@@ -57353,7 +57353,7 @@
     ctor public ClosedSelectorException();
   }
 
-  public abstract interface CompletionHandler {
+  public abstract interface CompletionHandler<V, A> {
     method public abstract void completed(V, A);
     method public abstract void failed(java.lang.Throwable, A);
   }
@@ -57377,7 +57377,7 @@
     method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
     method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException;
     method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException;
-    method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.net.DatagramSocket socket();
     method public final int validOps();
     method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException;
@@ -57482,8 +57482,8 @@
   public abstract interface NetworkChannel implements java.nio.channels.Channel {
     method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException;
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
-    method public abstract T getOption(java.net.SocketOption<T>) throws java.io.IOException;
-    method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions();
   }
 
@@ -57605,7 +57605,7 @@
     method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
     method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException;
-    method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.net.ServerSocket socket();
     method public final int validOps();
   }
@@ -57628,7 +57628,7 @@
     method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException;
     method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
     method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
-    method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException;
     method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException;
     method public abstract java.net.Socket socket();
@@ -57913,11 +57913,11 @@
     ctor public DirectoryNotEmptyException(java.lang.String);
   }
 
-  public abstract interface DirectoryStream implements java.io.Closeable java.lang.Iterable {
+  public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable {
     method public abstract java.util.Iterator<T> iterator();
   }
 
-  public static abstract interface DirectoryStream.Filter {
+  public static abstract interface DirectoryStream.Filter<T> {
     method public abstract boolean accept(T) throws java.io.IOException;
   }
 
@@ -57929,7 +57929,7 @@
   public abstract class FileStore {
     ctor protected FileStore();
     method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException;
-    method public abstract V getFileStoreAttributeView(java.lang.Class<V>);
+    method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>);
     method public abstract long getTotalSpace() throws java.io.IOException;
     method public abstract long getUnallocatedSpace() throws java.io.IOException;
     method public abstract long getUsableSpace() throws java.io.IOException;
@@ -58001,7 +58001,7 @@
     enum_constant public static final java.nio.file.FileVisitResult TERMINATE;
   }
 
-  public abstract interface FileVisitor {
+  public abstract interface FileVisitor<T> {
     method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
     method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
     method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -58026,7 +58026,7 @@
     method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...);
     method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException;
     method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
-    method public static V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
     method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -58059,7 +58059,7 @@
     method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException;
     method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException;
     method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException;
-    method public static A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+    method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
     method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -58167,17 +58167,17 @@
     ctor public ReadOnlyFileSystemException();
   }
 
-  public abstract interface SecureDirectoryStream implements java.nio.file.DirectoryStream {
+  public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream {
     method public abstract void deleteDirectory(T) throws java.io.IOException;
     method public abstract void deleteFile(T) throws java.io.IOException;
-    method public abstract V getFileAttributeView(java.lang.Class<V>);
-    method public abstract V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException;
   }
 
-  public class SimpleFileVisitor implements java.nio.file.FileVisitor {
+  public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor {
     ctor protected SimpleFileVisitor();
     method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
     method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -58215,13 +58215,13 @@
     field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW;
   }
 
-  public abstract interface WatchEvent {
+  public abstract interface WatchEvent<T> {
     method public abstract T context();
     method public abstract int count();
     method public abstract java.nio.file.WatchEvent.Kind<T> kind();
   }
 
-  public static abstract interface WatchEvent.Kind {
+  public static abstract interface WatchEvent.Kind<T> {
     method public abstract java.lang.String name();
     method public abstract java.lang.Class<T> type();
   }
@@ -58357,7 +58357,7 @@
     method public abstract boolean isSystem();
   }
 
-  public abstract interface FileAttribute {
+  public abstract interface FileAttribute<T> {
     method public abstract java.lang.String name();
     method public abstract T value();
   }
@@ -58454,7 +58454,7 @@
     method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public abstract void delete(java.nio.file.Path) throws java.io.IOException;
     method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException;
-    method public abstract V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
     method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
     method public abstract java.nio.file.Path getPath(java.net.URI);
@@ -58471,7 +58471,7 @@
     method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException;
     method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
     method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
-    method public abstract A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+    method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
     method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
     method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
     method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -58501,12 +58501,12 @@
 
   public final class AccessController {
     method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException;
-    method public static T doPrivileged(java.security.PrivilegedAction<T>);
-    method public static T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
-    method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
-    method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
-    method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>);
-    method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>);
+    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
+    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>);
+    method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
     method public static java.security.AccessControlContext getContext();
   }
 
@@ -58545,7 +58545,7 @@
     method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
-    method public final T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+    method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
     method public final java.security.Provider getProvider();
     method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
     method public final void init(byte[]) throws java.io.IOException;
@@ -58557,7 +58557,7 @@
     ctor public AlgorithmParametersSpi();
     method protected abstract byte[] engineGetEncoded() throws java.io.IOException;
     method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException;
-    method protected abstract T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+    method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
     method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
     method protected abstract void engineInit(byte[]) throws java.io.IOException;
     method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException;
@@ -58749,7 +58749,7 @@
     method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
-    method public final T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+    method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
     method public final java.security.Provider getProvider();
     method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException;
   }
@@ -58758,7 +58758,7 @@
     ctor public KeyFactorySpi();
     method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
     method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
-    method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+    method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
     method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException;
   }
 
@@ -59046,7 +59046,7 @@
     field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L
   }
 
-  public abstract interface PrivilegedAction {
+  public abstract interface PrivilegedAction<T> {
     method public abstract T run();
   }
 
@@ -59055,7 +59055,7 @@
     method public java.lang.Exception getException();
   }
 
-  public abstract interface PrivilegedExceptionAction {
+  public abstract interface PrivilegedExceptionAction<T> {
     method public abstract T run() throws java.lang.Exception;
   }
 
@@ -61249,11 +61249,11 @@
     method public abstract void free() throws java.sql.SQLException;
     method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException;
     method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException;
-    method public abstract T getSource(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException;
     method public abstract java.lang.String getString() throws java.sql.SQLException;
     method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException;
     method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException;
-    method public abstract T setResult(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException;
     method public abstract void setString(java.lang.String) throws java.sql.SQLException;
   }
 
@@ -61377,7 +61377,7 @@
 
   public abstract interface Wrapper {
     method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
-    method public abstract T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
   }
 
 }
@@ -61910,7 +61910,7 @@
 
 package java.util {
 
-  public abstract class AbstractCollection implements java.util.Collection {
+  public abstract class AbstractCollection<E> implements java.util.Collection {
     ctor protected AbstractCollection();
     method public boolean add(E);
     method public boolean addAll(java.util.Collection<? extends E>);
@@ -61924,10 +61924,10 @@
     method public boolean retainAll(java.util.Collection<?>);
     method public abstract int size();
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
   }
 
-  public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List {
+  public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List {
     ctor protected AbstractList();
     method public void add(int, E);
     method public boolean addAll(int, java.util.Collection<? extends E>);
@@ -61944,7 +61944,7 @@
     field protected transient int modCount;
   }
 
-  public abstract class AbstractMap implements java.util.Map {
+  public abstract class AbstractMap<K, V> implements java.util.Map {
     ctor protected AbstractMap();
     method public void clear();
     method public boolean containsKey(java.lang.Object);
@@ -61960,7 +61960,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable {
+  public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
     ctor public AbstractMap.SimpleEntry(K, V);
     ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>);
     method public K getKey();
@@ -61968,7 +61968,7 @@
     method public V setValue(V);
   }
 
-  public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable {
+  public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
     ctor public AbstractMap.SimpleImmutableEntry(K, V);
     ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>);
     method public K getKey();
@@ -61976,23 +61976,23 @@
     method public V setValue(V);
   }
 
-  public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue {
+  public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue {
     ctor protected AbstractQueue();
     method public E element();
     method public E remove();
   }
 
-  public abstract class AbstractSequentialList extends java.util.AbstractList {
+  public abstract class AbstractSequentialList<E> extends java.util.AbstractList {
     ctor protected AbstractSequentialList();
     method public E get(int);
     method public abstract java.util.ListIterator<E> listIterator(int);
   }
 
-  public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set {
+  public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set {
     ctor protected AbstractSet();
   }
 
-  public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
+  public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
     ctor public ArrayDeque();
     ctor public ArrayDeque(int);
     ctor public ArrayDeque(java.util.Collection<? extends E>);
@@ -62024,7 +62024,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public ArrayList(int);
     ctor public ArrayList();
     ctor public ArrayList(java.util.Collection<? extends E>);
@@ -62041,7 +62041,7 @@
   }
 
   public class Arrays {
-    method public static java.util.List<T> asList(T...);
+    method public static <T> java.util.List<T> asList(T...);
     method public static int binarySearch(long[], long);
     method public static int binarySearch(long[], int, int, long);
     method public static int binarySearch(int[], int);
@@ -62058,10 +62058,10 @@
     method public static int binarySearch(float[], int, int, float);
     method public static int binarySearch(java.lang.Object[], java.lang.Object);
     method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object);
-    method public static int binarySearch(T[], T, java.util.Comparator<? super T>);
-    method public static int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
-    method public static T[] copyOf(T[], int);
-    method public static T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
+    method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>);
+    method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
+    method public static <T> T[] copyOf(T[], int);
+    method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
     method public static byte[] copyOf(byte[], int);
     method public static short[] copyOf(short[], int);
     method public static int[] copyOf(int[], int);
@@ -62070,8 +62070,8 @@
     method public static float[] copyOf(float[], int);
     method public static double[] copyOf(double[], int);
     method public static boolean[] copyOf(boolean[], int);
-    method public static T[] copyOfRange(T[], int, int);
-    method public static T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
+    method public static <T> T[] copyOfRange(T[], int, int);
+    method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
     method public static byte[] copyOfRange(byte[], int, int);
     method public static short[] copyOfRange(short[], int, int);
     method public static int[] copyOfRange(int[], int, int);
@@ -62119,15 +62119,15 @@
     method public static int hashCode(float[]);
     method public static int hashCode(double[]);
     method public static int hashCode(java.lang.Object[]);
-    method public static void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
-    method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
     method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator);
     method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator);
     method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator);
     method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator);
     method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator);
     method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator);
-    method public static void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
+    method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
     method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator);
     method public static void parallelSetAll(long[], java.util.function.IntToLongFunction);
     method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction);
@@ -62145,11 +62145,11 @@
     method public static void parallelSort(float[], int, int);
     method public static void parallelSort(double[]);
     method public static void parallelSort(double[], int, int);
-    method public static void parallelSort(T[]);
-    method public static void parallelSort(T[], int, int);
-    method public static void parallelSort(T[], java.util.Comparator<? super T>);
-    method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>);
-    method public static void setAll(T[], java.util.function.IntFunction<? extends T>);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int);
+    method public static <T> void parallelSort(T[], java.util.Comparator<? super T>);
+    method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>);
+    method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>);
     method public static void setAll(int[], java.util.function.IntUnaryOperator);
     method public static void setAll(long[], java.util.function.IntToLongFunction);
     method public static void setAll(double[], java.util.function.IntToDoubleFunction);
@@ -62169,18 +62169,18 @@
     method public static void sort(double[], int, int);
     method public static void sort(java.lang.Object[]);
     method public static void sort(java.lang.Object[], int, int);
-    method public static void sort(T[], java.util.Comparator<? super T>);
-    method public static void sort(T[], int, int, java.util.Comparator<? super T>);
-    method public static java.util.Spliterator<T> spliterator(T[]);
-    method public static java.util.Spliterator<T> spliterator(T[], int, int);
+    method public static <T> void sort(T[], java.util.Comparator<? super T>);
+    method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>);
+    method public static <T> java.util.Spliterator<T> spliterator(T[]);
+    method public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
     method public static java.util.Spliterator.OfInt spliterator(int[]);
     method public static java.util.Spliterator.OfInt spliterator(int[], int, int);
     method public static java.util.Spliterator.OfLong spliterator(long[]);
     method public static java.util.Spliterator.OfLong spliterator(long[], int, int);
     method public static java.util.Spliterator.OfDouble spliterator(double[]);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
-    method public static java.util.stream.Stream<T> stream(T[]);
-    method public static java.util.stream.Stream<T> stream(T[], int, int);
+    method public static <T> java.util.stream.Stream<T> stream(T[]);
+    method public static <T> java.util.stream.Stream<T> stream(T[], int, int);
     method public static java.util.stream.IntStream stream(int[]);
     method public static java.util.stream.IntStream stream(int[], int, int);
     method public static java.util.stream.LongStream stream(long[]);
@@ -62364,7 +62364,7 @@
     field protected long time;
   }
 
-  public abstract interface Collection implements java.lang.Iterable {
+  public abstract interface Collection<E> implements java.lang.Iterable {
     method public abstract boolean add(E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
     method public abstract void clear();
@@ -62382,86 +62382,86 @@
     method public abstract int size();
     method public default java.util.stream.Stream<E> stream();
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
   public class Collections {
-    method public static boolean addAll(java.util.Collection<? super T>, T...);
-    method public static java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
-    method public static int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
-    method public static int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
-    method public static java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
-    method public static java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
-    method public static java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
-    method public static java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
-    method public static java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
-    method public static java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
-    method public static void copy(java.util.List<? super T>, java.util.List<? extends T>);
+    method public static <T> boolean addAll(java.util.Collection<? super T>, T...);
+    method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
+    method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
+    method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
+    method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
+    method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
+    method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
+    method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
+    method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
+    method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
+    method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>);
     method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>);
-    method public static java.util.Enumeration<T> emptyEnumeration();
-    method public static java.util.Iterator<T> emptyIterator();
-    method public static final java.util.List<T> emptyList();
-    method public static java.util.ListIterator<T> emptyListIterator();
-    method public static final java.util.Map<K, V> emptyMap();
-    method public static final java.util.Set<T> emptySet();
-    method public static java.util.Enumeration<T> enumeration(java.util.Collection<T>);
-    method public static void fill(java.util.List<? super T>, T);
+    method public static <T> java.util.Enumeration<T> emptyEnumeration();
+    method public static <T> java.util.Iterator<T> emptyIterator();
+    method public static final <T> java.util.List<T> emptyList();
+    method public static <T> java.util.ListIterator<T> emptyListIterator();
+    method public static final <K, V> java.util.Map<K, V> emptyMap();
+    method public static final <T> java.util.Set<T> emptySet();
+    method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>);
+    method public static <T> void fill(java.util.List<? super T>, T);
     method public static int frequency(java.util.Collection<?>, java.lang.Object);
     method public static int indexOfSubList(java.util.List<?>, java.util.List<?>);
     method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>);
-    method public static java.util.ArrayList<T> list(java.util.Enumeration<T>);
-    method public static T max(java.util.Collection<? extends T>);
-    method public static T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
-    method public static T min(java.util.Collection<? extends T>);
-    method public static T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
-    method public static java.util.List<T> nCopies(int, T);
-    method public static java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
-    method public static boolean replaceAll(java.util.List<T>, T, T);
+    method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>);
+    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>);
+    method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
+    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>);
+    method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
+    method public static <T> java.util.List<T> nCopies(int, T);
+    method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
+    method public static <T> boolean replaceAll(java.util.List<T>, T, T);
     method public static void reverse(java.util.List<?>);
-    method public static java.util.Comparator<T> reverseOrder();
-    method public static java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
+    method public static <T> java.util.Comparator<T> reverseOrder();
+    method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
     method public static void rotate(java.util.List<?>, int);
     method public static void shuffle(java.util.List<?>);
     method public static void shuffle(java.util.List<?>, java.util.Random);
-    method public static java.util.Set<E> singleton(E);
-    method public static java.util.List<E> singletonList(E);
-    method public static java.util.Map<K, V> singletonMap(K, V);
-    method public static void sort(java.util.List<T>);
-    method public static void sort(java.util.List<T>, java.util.Comparator<? super T>);
+    method public static <E> java.util.Set<E> singleton(E);
+    method public static <E> java.util.List<E> singletonList(E);
+    method public static <K, V> java.util.Map<K, V> singletonMap(K, V);
+    method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>);
+    method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>);
     method public static void swap(java.util.List<?>, int, int);
-    method public static java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
-    method public static java.util.List<T> synchronizedList(java.util.List<T>);
-    method public static java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
-    method public static java.util.Set<T> synchronizedSet(java.util.Set<T>);
-    method public static java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
-    method public static java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
-    method public static java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
-    method public static java.util.List<T> unmodifiableList(java.util.List<? extends T>);
-    method public static java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
-    method public static java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
-    method public static java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
-    method public static java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
+    method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
+    method public static <T> java.util.List<T> synchronizedList(java.util.List<T>);
+    method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
+    method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>);
+    method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
+    method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
+    method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
+    method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>);
+    method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
+    method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
+    method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
+    method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
     field public static final java.util.List EMPTY_LIST;
     field public static final java.util.Map EMPTY_MAP;
     field public static final java.util.Set EMPTY_SET;
   }
 
-  public abstract interface Comparator {
+  public abstract interface Comparator<T> {
     method public abstract int compare(T, T);
-    method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
-    method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
+    method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
+    method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
     method public abstract boolean equals(java.lang.Object);
-    method public static java.util.Comparator<T> naturalOrder();
-    method public static java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
-    method public static java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
-    method public static java.util.Comparator<T> reverseOrder();
+    method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder();
+    method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
+    method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
+    method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder();
     method public default java.util.Comparator<T> reversed();
     method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>);
-    method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
-    method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
+    method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
+    method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
     method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>);
     method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>);
     method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>);
@@ -62520,7 +62520,7 @@
     method public deprecated java.lang.String toLocaleString();
   }
 
-  public abstract interface Deque implements java.util.Queue {
+  public abstract interface Deque<E> implements java.util.Queue {
     method public abstract boolean add(E);
     method public abstract void addFirst(E);
     method public abstract void addLast(E);
@@ -62550,7 +62550,7 @@
     method public abstract int size();
   }
 
-  public abstract class Dictionary {
+  public abstract class Dictionary<K, V> {
     ctor public Dictionary();
     method public abstract java.util.Enumeration<V> elements();
     method public abstract V get(java.lang.Object);
@@ -62581,7 +62581,7 @@
     ctor public EmptyStackException();
   }
 
-  public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
+  public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
     ctor public EnumMap(java.lang.Class<K>);
     ctor public EnumMap(java.util.EnumMap<K, ? extends V>);
     ctor public EnumMap(java.util.Map<K, ? extends V>);
@@ -62589,23 +62589,23 @@
     method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
   }
 
-  public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
-    method public static java.util.EnumSet<E> allOf(java.lang.Class<E>);
+  public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>);
     method public java.util.EnumSet<E> clone();
-    method public static java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
-    method public static java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
-    method public static java.util.EnumSet<E> copyOf(java.util.Collection<E>);
-    method public static java.util.EnumSet<E> noneOf(java.lang.Class<E>);
-    method public static java.util.EnumSet<E> of(E);
-    method public static java.util.EnumSet<E> of(E, E);
-    method public static java.util.EnumSet<E> of(E, E, E);
-    method public static java.util.EnumSet<E> of(E, E, E, E);
-    method public static java.util.EnumSet<E> of(E, E, E, E, E);
-    method public static java.util.EnumSet<E> of(E, E...);
-    method public static java.util.EnumSet<E> range(E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E);
   }
 
-  public abstract interface Enumeration {
+  public abstract interface Enumeration<E> {
     method public abstract boolean hasMoreElements();
     method public abstract E nextElement();
   }
@@ -62613,7 +62613,7 @@
   public abstract interface EventListener {
   }
 
-  public abstract class EventListenerProxy implements java.util.EventListener {
+  public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener {
     ctor public EventListenerProxy(T);
     method public T getListener();
   }
@@ -62699,7 +62699,7 @@
     field public static final int BC = 0; // 0x0
   }
 
-  public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public HashMap(int, float);
     ctor public HashMap(int);
     ctor public HashMap();
@@ -62719,7 +62719,7 @@
     method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
   }
 
-  public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+  public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
     ctor public HashSet();
     ctor public HashSet(java.util.Collection<? extends E>);
     ctor public HashSet(int, float);
@@ -62730,7 +62730,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public Hashtable(int, float);
     ctor public Hashtable(int);
     ctor public Hashtable();
@@ -62765,7 +62765,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public IdentityHashMap();
     ctor public IdentityHashMap(int);
     ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
@@ -62832,14 +62832,14 @@
     ctor public InvalidPropertiesFormatException(java.lang.String);
   }
 
-  public abstract interface Iterator {
+  public abstract interface Iterator<E> {
     method public default void forEachRemaining(java.util.function.Consumer<? super E>);
     method public abstract boolean hasNext();
     method public abstract E next();
     method public default void remove();
   }
 
-  public class LinkedHashMap extends java.util.HashMap implements java.util.Map {
+  public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map {
     ctor public LinkedHashMap(int, float);
     ctor public LinkedHashMap(int);
     ctor public LinkedHashMap();
@@ -62848,14 +62848,14 @@
     method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>);
   }
 
-  public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+  public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
     ctor public LinkedHashSet(int, float);
     ctor public LinkedHashSet(int);
     ctor public LinkedHashSet();
     ctor public LinkedHashSet(java.util.Collection<? extends E>);
   }
 
-  public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
+  public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
     ctor public LinkedList();
     ctor public LinkedList(java.util.Collection<? extends E>);
     method public void addFirst(E);
@@ -62886,7 +62886,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public abstract interface List implements java.util.Collection {
+  public abstract interface List<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract void add(int, E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
@@ -62913,10 +62913,10 @@
     method public default void sort(java.util.Comparator<? super E>);
     method public abstract java.util.List<E> subList(int, int);
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
-  public abstract interface ListIterator implements java.util.Iterator {
+  public abstract interface ListIterator<E> implements java.util.Iterator {
     method public abstract void add(E);
     method public abstract boolean hasNext();
     method public abstract boolean hasPrevious();
@@ -63033,7 +63033,7 @@
     method public final long getSum();
   }
 
-  public abstract interface Map {
+  public abstract interface Map<K, V> {
     method public abstract void clear();
     method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
     method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
@@ -63061,11 +63061,11 @@
     method public abstract java.util.Collection<V> values();
   }
 
-  public static abstract interface Map.Entry {
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
+  public static abstract interface Map.Entry<K, V> {
+    method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
+    method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
+    method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
+    method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
     method public abstract boolean equals(java.lang.Object);
     method public abstract K getKey();
     method public abstract V getValue();
@@ -63089,7 +63089,7 @@
     method public java.lang.String getKey();
   }
 
-  public abstract interface NavigableMap implements java.util.SortedMap {
+  public abstract interface NavigableMap<K, V> implements java.util.SortedMap {
     method public abstract java.util.Map.Entry<K, V> ceilingEntry(K);
     method public abstract K ceilingKey(K);
     method public abstract java.util.NavigableSet<K> descendingKeySet();
@@ -63113,7 +63113,7 @@
     method public abstract java.util.SortedMap<K, V> tailMap(K);
   }
 
-  public abstract interface NavigableSet implements java.util.SortedSet {
+  public abstract interface NavigableSet<E> implements java.util.SortedSet {
     method public abstract E ceiling(E);
     method public abstract java.util.Iterator<E> descendingIterator();
     method public abstract java.util.NavigableSet<E> descendingSet();
@@ -63137,16 +63137,16 @@
   }
 
   public final class Objects {
-    method public static int compare(T, T, java.util.Comparator<? super T>);
+    method public static <T> int compare(T, T, java.util.Comparator<? super T>);
     method public static boolean deepEquals(java.lang.Object, java.lang.Object);
     method public static boolean equals(java.lang.Object, java.lang.Object);
     method public static int hash(java.lang.Object...);
     method public static int hashCode(java.lang.Object);
     method public static boolean isNull(java.lang.Object);
     method public static boolean nonNull(java.lang.Object);
-    method public static T requireNonNull(T);
-    method public static T requireNonNull(T, java.lang.String);
-    method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
+    method public static <T> T requireNonNull(T);
+    method public static <T> T requireNonNull(T, java.lang.String);
+    method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
     method public static java.lang.String toString(java.lang.Object);
     method public static java.lang.String toString(java.lang.Object, java.lang.String);
   }
@@ -63168,19 +63168,19 @@
     method public abstract void update(java.util.Observable, java.lang.Object);
   }
 
-  public final class Optional {
-    method public static java.util.Optional<T> empty();
+  public final class Optional<T> {
+    method public static <T> java.util.Optional<T> empty();
     method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>);
-    method public java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
+    method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
     method public T get();
     method public void ifPresent(java.util.function.Consumer<? super T>);
     method public boolean isPresent();
-    method public java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.Optional<T> of(T);
-    method public static java.util.Optional<T> ofNullable(T);
+    method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
+    method public static <T> java.util.Optional<T> of(T);
+    method public static <T> java.util.Optional<T> ofNullable(T);
     method public T orElse(T);
     method public T orElseGet(java.util.function.Supplier<? extends T>);
-    method public T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
   }
 
   public final class OptionalDouble {
@@ -63191,7 +63191,7 @@
     method public static java.util.OptionalDouble of(double);
     method public double orElse(double);
     method public double orElseGet(java.util.function.DoubleSupplier);
-    method public double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
   public final class OptionalInt {
@@ -63202,7 +63202,7 @@
     method public static java.util.OptionalInt of(int);
     method public int orElse(int);
     method public int orElseGet(java.util.function.IntSupplier);
-    method public int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
   public final class OptionalLong {
@@ -63213,10 +63213,10 @@
     method public static java.util.OptionalLong of(long);
     method public long orElse(long);
     method public long orElseGet(java.util.function.LongSupplier);
-    method public long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
-  public abstract interface PrimitiveIterator implements java.util.Iterator {
+  public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator {
     method public abstract void forEachRemaining(T_CONS);
   }
 
@@ -63241,7 +63241,7 @@
     method public abstract long nextLong();
   }
 
-  public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable {
+  public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable {
     ctor public PriorityQueue();
     ctor public PriorityQueue(int);
     ctor public PriorityQueue(java.util.Comparator<? super E>);
@@ -63290,7 +63290,7 @@
     method public java.lang.Object handleGetObject(java.lang.String);
   }
 
-  public abstract interface Queue implements java.util.Collection {
+  public abstract interface Queue<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract E element();
     method public abstract boolean offer(E);
@@ -63442,15 +63442,15 @@
     ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable);
   }
 
-  public final class ServiceLoader implements java.lang.Iterable {
+  public final class ServiceLoader<S> implements java.lang.Iterable {
     method public java.util.Iterator<S> iterator();
-    method public static java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
-    method public static java.util.ServiceLoader<S> load(java.lang.Class<S>);
-    method public static java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
+    method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
+    method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>);
+    method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
     method public void reload();
   }
 
-  public abstract interface Set implements java.util.Collection {
+  public abstract interface Set<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
     method public abstract void clear();
@@ -63465,7 +63465,7 @@
     method public abstract boolean retainAll(java.util.Collection<?>);
     method public abstract int size();
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
   public class SimpleTimeZone extends java.util.TimeZone {
@@ -63491,7 +63491,7 @@
     field public static final int WALL_TIME = 0; // 0x0
   }
 
-  public abstract interface SortedMap implements java.util.Map {
+  public abstract interface SortedMap<K, V> implements java.util.Map {
     method public abstract java.util.Comparator<? super K> comparator();
     method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet();
     method public abstract K firstKey();
@@ -63503,7 +63503,7 @@
     method public abstract java.util.Collection<V> values();
   }
 
-  public abstract interface SortedSet implements java.util.Set {
+  public abstract interface SortedSet<E> implements java.util.Set {
     method public abstract java.util.Comparator<? super E> comparator();
     method public abstract E first();
     method public abstract java.util.SortedSet<E> headSet(E);
@@ -63512,7 +63512,7 @@
     method public abstract java.util.SortedSet<E> tailSet(E);
   }
 
-  public abstract interface Spliterator {
+  public abstract interface Spliterator<T> {
     method public abstract int characteristics();
     method public abstract long estimateSize();
     method public default void forEachRemaining(java.util.function.Consumer<? super T>);
@@ -63555,7 +63555,7 @@
     method public abstract java.util.Spliterator.OfLong trySplit();
   }
 
-  public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator {
+  public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator {
     method public default void forEachRemaining(T_CONS);
     method public abstract boolean tryAdvance(T_CONS);
     method public abstract T_SPLITR trySplit();
@@ -63565,25 +63565,25 @@
     method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator();
     method public static java.util.Spliterator.OfInt emptyIntSpliterator();
     method public static java.util.Spliterator.OfLong emptyLongSpliterator();
-    method public static java.util.Spliterator<T> emptySpliterator();
-    method public static java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>);
+    method public static <T> java.util.Spliterator<T> emptySpliterator();
+    method public static <T> java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>);
     method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt);
     method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong);
     method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble);
-    method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int);
-    method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
     method public static java.util.Spliterator.OfInt spliterator(int[], int);
     method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int);
     method public static java.util.Spliterator.OfLong spliterator(long[], int);
     method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int);
-    method public static java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int);
-    method public static java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int);
     method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int);
     method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int);
     method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int);
-    method public static java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int);
+    method public static <T> java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int);
     method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int);
     method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int);
     method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int);
@@ -63610,7 +63610,7 @@
     method public java.util.Spliterator.OfLong trySplit();
   }
 
-  public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator {
+  public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator {
     ctor protected Spliterators.AbstractSpliterator(long, int);
     method public int characteristics();
     method public long estimateSize();
@@ -63645,7 +63645,7 @@
     method public java.util.SplittableRandom split();
   }
 
-  public class Stack extends java.util.Vector {
+  public class Stack<E> extends java.util.Vector {
     ctor public Stack();
     method public boolean empty();
     method public synchronized E peek();
@@ -63729,7 +63729,7 @@
     ctor public TooManyListenersException(java.lang.String);
   }
 
-  public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
+  public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
     ctor public TreeMap();
     ctor public TreeMap(java.util.Comparator<? super K>);
     ctor public TreeMap(java.util.Map<? extends K, ? extends V>);
@@ -63766,7 +63766,7 @@
     method public java.util.SortedMap<K, V> tailMap(K);
   }
 
-  public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+  public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
     ctor public TreeSet();
     ctor public TreeSet(java.util.Comparator<? super E>);
     ctor public TreeSet(java.util.Collection<? extends E>);
@@ -63819,7 +63819,7 @@
     method public java.lang.String getFlags();
   }
 
-  public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public Vector(int, int);
     ctor public Vector(int);
     ctor public Vector();
@@ -63854,7 +63854,7 @@
     field protected java.lang.Object[] elementData;
   }
 
-  public class WeakHashMap extends java.util.AbstractMap implements java.util.Map {
+  public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map {
     ctor public WeakHashMap(int, float);
     ctor public WeakHashMap(int);
     ctor public WeakHashMap();
@@ -63870,18 +63870,18 @@
 
   public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService {
     ctor public AbstractExecutorService();
-    method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
-    method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
-    method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
-    method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
+    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+    method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
+    method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
     method public java.util.concurrent.Future<?> submit(java.lang.Runnable);
-    method public java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
-    method public java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+    method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+    method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
   }
 
-  public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public ArrayBlockingQueue(int);
     ctor public ArrayBlockingQueue(int, boolean);
     ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>);
@@ -63900,7 +63900,7 @@
     method public E take() throws java.lang.InterruptedException;
   }
 
-  public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque {
+  public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque {
     method public abstract boolean add(E);
     method public abstract void addFirst(E);
     method public abstract void addLast(E);
@@ -63932,7 +63932,7 @@
     method public abstract E takeLast() throws java.lang.InterruptedException;
   }
 
-  public abstract interface BlockingQueue implements java.util.Queue {
+  public abstract interface BlockingQueue<E> implements java.util.Queue {
     method public abstract boolean add(E);
     method public abstract boolean contains(java.lang.Object);
     method public abstract int drainTo(java.util.Collection<? super E>);
@@ -63951,7 +63951,7 @@
     ctor public BrokenBarrierException(java.lang.String);
   }
 
-  public abstract interface Callable {
+  public abstract interface Callable<V> {
     method public abstract V call() throws java.lang.Exception;
   }
 
@@ -63960,28 +63960,28 @@
     ctor public CancellationException(java.lang.String);
   }
 
-  public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
+  public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
     ctor public CompletableFuture();
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...);
     method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...);
-    method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
     method public boolean cancel(boolean);
     method public boolean complete(T);
     method public boolean completeExceptionally(java.lang.Throwable);
-    method public static java.util.concurrent.CompletableFuture<U> completedFuture(U);
+    method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U);
     method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
     method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
     method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
     method public T getNow(T);
     method public int getNumberOfDependents();
-    method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
     method public boolean isCancelled();
     method public boolean isCompletedExceptionally();
     method public boolean isDone();
@@ -63996,23 +63996,23 @@
     method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor);
-    method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
-    method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
+    method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
+    method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
@@ -64032,7 +64032,7 @@
     ctor public CompletionException(java.lang.Throwable);
   }
 
-  public abstract interface CompletionService {
+  public abstract interface CompletionService<V> {
     method public abstract java.util.concurrent.Future<V> poll();
     method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
     method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
@@ -64040,17 +64040,17 @@
     method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
   }
 
-  public abstract interface CompletionStage {
+  public abstract interface CompletionStage<T> {
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
-    method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
@@ -64060,18 +64060,18 @@
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
@@ -64081,7 +64081,7 @@
     method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor);
   }
 
-  public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
+  public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
     ctor public ConcurrentHashMap();
     ctor public ConcurrentHashMap(int);
     ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
@@ -64095,29 +64095,29 @@
     method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
     method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
     method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
-    method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
-    method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachKey(long, java.util.function.Consumer<? super K>);
-    method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachValue(long, java.util.function.Consumer<? super V>);
-    method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
     method public V getOrDefault(java.lang.Object, V);
     method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
     method public java.util.Enumeration<K> keys();
     method public long mappingCount();
     method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
-    method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
-    method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
+    method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
+    method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
     method public V putIfAbsent(K, V);
-    method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
-    method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator);
     method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator);
     method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>);
-    method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator);
     method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator);
@@ -64125,7 +64125,7 @@
     method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator);
     method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator);
     method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
-    method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
     method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
@@ -64133,13 +64133,13 @@
     method public boolean replace(K, V, V);
     method public V replace(K, V);
     method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
-    method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
-    method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
-    method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
-    method public U searchValues(long, java.util.function.Function<? super V, ? extends U>);
+    method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
+    method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
+    method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
+    method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>);
   }
 
-   static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable {
+   static abstract class ConcurrentHashMap.CollectionView<K, V, E> implements java.util.Collection java.io.Serializable {
     method public final void clear();
     method public abstract boolean contains(java.lang.Object);
     method public final boolean containsAll(java.util.Collection<?>);
@@ -64151,11 +64151,11 @@
     method public final boolean retainAll(java.util.Collection<?>);
     method public final int size();
     method public final java.lang.Object[] toArray();
-    method public final T[] toArray(T[]);
+    method public final <T> T[] toArray(T[]);
     method public final java.lang.String toString();
   }
 
-  public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set {
+  public static class ConcurrentHashMap.KeySetView<K, V> extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set {
     method public boolean add(K);
     method public boolean addAll(java.util.Collection<? extends K>);
     method public boolean contains(java.lang.Object);
@@ -64166,7 +64166,7 @@
     method public java.util.Spliterator<K> spliterator();
   }
 
-  public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
+  public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
     ctor public ConcurrentLinkedDeque();
     ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>);
     method public void addFirst(E);
@@ -64196,7 +64196,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
+  public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
     ctor public ConcurrentLinkedQueue();
     ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>);
     method public java.util.Iterator<E> iterator();
@@ -64207,14 +64207,14 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public abstract interface ConcurrentMap implements java.util.Map {
+  public abstract interface ConcurrentMap<K, V> implements java.util.Map {
     method public abstract V putIfAbsent(K, V);
     method public abstract boolean remove(java.lang.Object, java.lang.Object);
     method public abstract boolean replace(K, V, V);
     method public abstract V replace(K, V);
   }
 
-  public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
+  public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
     method public abstract java.util.NavigableSet<K> descendingKeySet();
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
@@ -64227,7 +64227,7 @@
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
   }
 
-  public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
+  public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
     ctor public ConcurrentSkipListMap();
     ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>);
     ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>);
@@ -64271,7 +64271,7 @@
     method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
   }
 
-  public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+  public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
     ctor public ConcurrentSkipListSet();
     ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>);
     ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>);
@@ -64299,7 +64299,7 @@
     method public java.util.NavigableSet<E> tailSet(E);
   }
 
-  public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public CopyOnWriteArrayList();
     ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>);
     ctor public CopyOnWriteArrayList(E[]);
@@ -64331,10 +64331,10 @@
     method public int size();
     method public java.util.List<E> subList(int, int);
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
   }
 
-  public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable {
+  public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable {
     ctor public CopyOnWriteArraySet();
     ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
     method public void forEach(java.util.function.Consumer<? super E>);
@@ -64352,7 +64352,7 @@
     method public long getCount();
   }
 
-  public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask {
+  public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask {
     ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int);
     ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>);
     ctor protected CountedCompleter();
@@ -64389,7 +64389,7 @@
     method public void reset();
   }
 
-  public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
+  public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
     ctor public DelayQueue();
     ctor public DelayQueue(java.util.Collection<? extends E>);
     method public int drainTo(java.util.Collection<? super E>);
@@ -64410,7 +64410,7 @@
     method public abstract long getDelay(java.util.concurrent.TimeUnit);
   }
 
-  public class Exchanger {
+  public class Exchanger<V> {
     ctor public Exchanger();
     method public V exchange(V) throws java.lang.InterruptedException;
     method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -64427,7 +64427,7 @@
     method public abstract void execute(java.lang.Runnable);
   }
 
-  public class ExecutorCompletionService implements java.util.concurrent.CompletionService {
+  public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService {
     ctor public ExecutorCompletionService(java.util.concurrent.Executor);
     ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>);
     method public java.util.concurrent.Future<V> poll();
@@ -64439,21 +64439,21 @@
 
   public abstract interface ExecutorService implements java.util.concurrent.Executor {
     method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
-    method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+    method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+    method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
     method public abstract boolean isShutdown();
     method public abstract boolean isTerminated();
     method public abstract void shutdown();
     method public abstract java.util.List<java.lang.Runnable> shutdownNow();
-    method public abstract java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
-    method public abstract java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+    method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+    method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
     method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable);
   }
 
   public class Executors {
-    method public static java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
+    method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>);
@@ -64470,8 +64470,8 @@
     method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory);
     method public static java.util.concurrent.ExecutorService newWorkStealingPool(int);
     method public static java.util.concurrent.ExecutorService newWorkStealingPool();
-    method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
-    method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
+    method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
+    method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
     method public static java.util.concurrent.ThreadFactory privilegedThreadFactory();
     method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService);
     method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService);
@@ -64499,7 +64499,7 @@
     method public long getStealCount();
     method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
     method public boolean hasQueuedSubmissions();
-    method public T invoke(java.util.concurrent.ForkJoinTask<T>);
+    method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>);
     method public boolean isQuiescent();
     method public boolean isShutdown();
     method public boolean isTerminated();
@@ -64508,7 +64508,7 @@
     method protected java.util.concurrent.ForkJoinTask<?> pollSubmission();
     method public void shutdown();
     method public java.util.List<java.lang.Runnable> shutdownNow();
-    method public java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
+    method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
     field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
   }
 
@@ -64521,11 +64521,11 @@
     method public abstract boolean isReleasable();
   }
 
-  public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable {
+  public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable {
     ctor public ForkJoinTask();
     method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable);
-    method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
-    method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
+    method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
+    method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
     method public boolean cancel(boolean);
     method public final boolean compareAndSetForkJoinTaskTag(short, short);
     method public void complete(V);
@@ -64545,7 +64545,7 @@
     method public final V invoke();
     method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>, java.util.concurrent.ForkJoinTask<?>);
     method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>...);
-    method public static java.util.Collection<T> invokeAll(java.util.Collection<T>);
+    method public static <T extends java.util.concurrent.ForkJoinTask<?>> java.util.Collection<T> invokeAll(java.util.Collection<T>);
     method public final boolean isCancelled();
     method public final boolean isCompletedAbnormally();
     method public final boolean isCompletedNormally();
@@ -64571,7 +64571,7 @@
     method protected void onTermination(java.lang.Throwable);
   }
 
-  public abstract interface Future {
+  public abstract interface Future<V> {
     method public abstract boolean cancel(boolean);
     method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
     method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -64579,7 +64579,7 @@
     method public abstract boolean isDone();
   }
 
-  public class FutureTask implements java.util.concurrent.RunnableFuture {
+  public class FutureTask<V> implements java.util.concurrent.RunnableFuture {
     ctor public FutureTask(java.util.concurrent.Callable<V>);
     ctor public FutureTask(java.lang.Runnable, V);
     method public boolean cancel(boolean);
@@ -64594,7 +64594,7 @@
     method protected void setException(java.lang.Throwable);
   }
 
-  public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
+  public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
     ctor public LinkedBlockingDeque();
     ctor public LinkedBlockingDeque(int);
     ctor public LinkedBlockingDeque(java.util.Collection<? extends E>);
@@ -64638,7 +64638,7 @@
     method public E takeLast() throws java.lang.InterruptedException;
   }
 
-  public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public LinkedBlockingQueue();
     ctor public LinkedBlockingQueue(int);
     ctor public LinkedBlockingQueue(java.util.Collection<? extends E>);
@@ -64657,7 +64657,7 @@
     method public E take() throws java.lang.InterruptedException;
   }
 
-  public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
+  public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
     ctor public LinkedTransferQueue();
     ctor public LinkedTransferQueue(java.util.Collection<? extends E>);
     method public int drainTo(java.util.Collection<? super E>);
@@ -64704,7 +64704,7 @@
     method public int register();
   }
 
-  public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public PriorityBlockingQueue();
     ctor public PriorityBlockingQueue(int);
     ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>);
@@ -64733,7 +64733,7 @@
     method protected final void setRawResult(java.lang.Void);
   }
 
-  public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask {
+  public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask {
     ctor public RecursiveTask();
     method protected abstract V compute();
     method protected final boolean exec();
@@ -64752,22 +64752,22 @@
     method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
   }
 
-  public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable {
+  public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable {
     method public abstract void run();
   }
 
-  public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
+  public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
     method public abstract boolean isPeriodic();
   }
 
   public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService {
     method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
-    method public abstract java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+    method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
     method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
   }
 
-  public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future {
+  public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future {
   }
 
   public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService {
@@ -64775,13 +64775,13 @@
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory);
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler);
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
-    method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
-    method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
+    method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
+    method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
     method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy();
     method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy();
     method public boolean getRemoveOnCancelPolicy();
     method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
-    method public java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+    method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
     method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean);
@@ -64811,7 +64811,7 @@
     method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
   }
 
-  public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public SynchronousQueue();
     ctor public SynchronousQueue(boolean);
     method public int drainTo(java.util.Collection<? super E>);
@@ -64929,7 +64929,7 @@
     ctor public TimeoutException(java.lang.String);
   }
 
-  public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue {
+  public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue {
     method public abstract int getWaitingConsumerCount();
     method public abstract boolean hasWaitingConsumer();
     method public abstract void transfer(E) throws java.lang.InterruptedException;
@@ -64999,7 +64999,7 @@
     method public final boolean weakCompareAndSet(int, int, int);
   }
 
-  public abstract class AtomicIntegerFieldUpdater {
+  public abstract class AtomicIntegerFieldUpdater<T> {
     ctor protected AtomicIntegerFieldUpdater();
     method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator);
     method public int addAndGet(T, int);
@@ -65014,7 +65014,7 @@
     method public final int getAndUpdate(T, java.util.function.IntUnaryOperator);
     method public int incrementAndGet(T);
     method public abstract void lazySet(T, int);
-    method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+    method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
     method public abstract void set(T, int);
     method public final int updateAndGet(T, java.util.function.IntUnaryOperator);
     method public abstract boolean weakCompareAndSet(T, int, int);
@@ -65067,7 +65067,7 @@
     method public final boolean weakCompareAndSet(int, long, long);
   }
 
-  public abstract class AtomicLongFieldUpdater {
+  public abstract class AtomicLongFieldUpdater<T> {
     ctor protected AtomicLongFieldUpdater();
     method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator);
     method public long addAndGet(T, long);
@@ -65082,13 +65082,13 @@
     method public final long getAndUpdate(T, java.util.function.LongUnaryOperator);
     method public long incrementAndGet(T);
     method public abstract void lazySet(T, long);
-    method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+    method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
     method public abstract void set(T, long);
     method public final long updateAndGet(T, java.util.function.LongUnaryOperator);
     method public abstract boolean weakCompareAndSet(T, long, long);
   }
 
-  public class AtomicMarkableReference {
+  public class AtomicMarkableReference<V> {
     ctor public AtomicMarkableReference(V, boolean);
     method public boolean attemptMark(V, boolean);
     method public boolean compareAndSet(V, V, boolean, boolean);
@@ -65099,7 +65099,7 @@
     method public boolean weakCompareAndSet(V, V, boolean, boolean);
   }
 
-  public class AtomicReference implements java.io.Serializable {
+  public class AtomicReference<V> implements java.io.Serializable {
     ctor public AtomicReference(V);
     ctor public AtomicReference();
     method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>);
@@ -65114,7 +65114,7 @@
     method public final boolean weakCompareAndSet(V, V);
   }
 
-  public class AtomicReferenceArray implements java.io.Serializable {
+  public class AtomicReferenceArray<E> implements java.io.Serializable {
     ctor public AtomicReferenceArray(int);
     ctor public AtomicReferenceArray(E[]);
     method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>);
@@ -65130,7 +65130,7 @@
     method public final boolean weakCompareAndSet(int, E, E);
   }
 
-  public abstract class AtomicReferenceFieldUpdater {
+  public abstract class AtomicReferenceFieldUpdater<T, V> {
     ctor protected AtomicReferenceFieldUpdater();
     method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>);
     method public abstract boolean compareAndSet(T, V, V);
@@ -65139,13 +65139,13 @@
     method public V getAndSet(T, V);
     method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>);
     method public abstract void lazySet(T, V);
-    method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
+    method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
     method public abstract void set(T, V);
     method public final V updateAndGet(T, java.util.function.UnaryOperator<V>);
     method public abstract boolean weakCompareAndSet(T, V, V);
   }
 
-  public class AtomicStampedReference {
+  public class AtomicStampedReference<V> {
     ctor public AtomicStampedReference(V, int);
     method public boolean attemptStamp(V, int);
     method public boolean compareAndSet(V, V, int, int);
@@ -65448,33 +65448,33 @@
 
 package java.util.function {
 
-  public abstract interface BiConsumer {
+  public abstract interface BiConsumer<T, U> {
     method public abstract void accept(T, U);
     method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>);
   }
 
-  public abstract interface BiFunction {
-    method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
+  public abstract interface BiFunction<T, U, R> {
+    method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
     method public abstract R apply(T, U);
   }
 
-  public abstract interface BiPredicate {
+  public abstract interface BiPredicate<T, U> {
     method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>);
     method public default java.util.function.BiPredicate<T, U> negate();
     method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>);
     method public abstract boolean test(T, U);
   }
 
-  public abstract interface BinaryOperator implements java.util.function.BiFunction {
-    method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
-    method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
+  public abstract interface BinaryOperator<T> implements java.util.function.BiFunction {
+    method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
   }
 
   public abstract interface BooleanSupplier {
     method public abstract boolean getAsBoolean();
   }
 
-  public abstract interface Consumer {
+  public abstract interface Consumer<T> {
     method public abstract void accept(T);
     method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>);
   }
@@ -65488,7 +65488,7 @@
     method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
   }
 
-  public abstract interface DoubleFunction {
+  public abstract interface DoubleFunction<R> {
     method public abstract R apply(double);
   }
 
@@ -65518,11 +65518,11 @@
     method public static java.util.function.DoubleUnaryOperator identity();
   }
 
-  public abstract interface Function {
-    method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
+  public abstract interface Function<T, R> {
+    method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
     method public abstract R apply(T);
-    method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
-    method public static java.util.function.Function<T, T> identity();
+    method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
+    method public static <T> java.util.function.Function<T, T> identity();
   }
 
   public abstract interface IntBinaryOperator {
@@ -65534,7 +65534,7 @@
     method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
   }
 
-  public abstract interface IntFunction {
+  public abstract interface IntFunction<R> {
     method public abstract R apply(int);
   }
 
@@ -65573,7 +65573,7 @@
     method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
   }
 
-  public abstract interface LongFunction {
+  public abstract interface LongFunction<R> {
     method public abstract R apply(long);
   }
 
@@ -65603,56 +65603,56 @@
     method public static java.util.function.LongUnaryOperator identity();
   }
 
-  public abstract interface ObjDoubleConsumer {
+  public abstract interface ObjDoubleConsumer<T> {
     method public abstract void accept(T, double);
   }
 
-  public abstract interface ObjIntConsumer {
+  public abstract interface ObjIntConsumer<T> {
     method public abstract void accept(T, int);
   }
 
-  public abstract interface ObjLongConsumer {
+  public abstract interface ObjLongConsumer<T> {
     method public abstract void accept(T, long);
   }
 
-  public abstract interface Predicate {
+  public abstract interface Predicate<T> {
     method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>);
-    method public static java.util.function.Predicate<T> isEqual(java.lang.Object);
+    method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object);
     method public default java.util.function.Predicate<T> negate();
     method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>);
     method public abstract boolean test(T);
   }
 
-  public abstract interface Supplier {
+  public abstract interface Supplier<T> {
     method public abstract T get();
   }
 
-  public abstract interface ToDoubleBiFunction {
+  public abstract interface ToDoubleBiFunction<T, U> {
     method public abstract double applyAsDouble(T, U);
   }
 
-  public abstract interface ToDoubleFunction {
+  public abstract interface ToDoubleFunction<T> {
     method public abstract double applyAsDouble(T);
   }
 
-  public abstract interface ToIntBiFunction {
+  public abstract interface ToIntBiFunction<T, U> {
     method public abstract int applyAsInt(T, U);
   }
 
-  public abstract interface ToIntFunction {
+  public abstract interface ToIntFunction<T> {
     method public abstract int applyAsInt(T);
   }
 
-  public abstract interface ToLongBiFunction {
+  public abstract interface ToLongBiFunction<T, U> {
     method public abstract long applyAsLong(T, U);
   }
 
-  public abstract interface ToLongFunction {
+  public abstract interface ToLongFunction<T> {
     method public abstract long applyAsLong(T);
   }
 
-  public abstract interface UnaryOperator implements java.util.function.Function {
-    method public static java.util.function.UnaryOperator<T> identity();
+  public abstract interface UnaryOperator<T> implements java.util.function.Function {
+    method public static <T> java.util.function.UnaryOperator<T> identity();
   }
 
 }
@@ -66240,7 +66240,7 @@
 
 package java.util.stream {
 
-  public abstract interface BaseStream implements java.lang.AutoCloseable {
+  public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable {
     method public abstract void close();
     method public abstract boolean isParallel();
     method public abstract java.util.Iterator<T> iterator();
@@ -66251,13 +66251,13 @@
     method public abstract S unordered();
   }
 
-  public abstract interface Collector {
+  public abstract interface Collector<T, A, R> {
     method public abstract java.util.function.BiConsumer<A, T> accumulator();
     method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics();
     method public abstract java.util.function.BinaryOperator<A> combiner();
     method public abstract java.util.function.Function<A, R> finisher();
-    method public static java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
-    method public static java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
+    method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
+    method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
     method public abstract java.util.function.Supplier<A> supplier();
   }
 
@@ -66270,43 +66270,43 @@
   }
 
   public final class Collectors {
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Long> counting();
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting();
+    method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
+    method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
+    method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining();
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence);
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence);
-    method public static java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
-    method public static java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
-    method public static java.util.stream.Collector<T, ?, java.util.List<T>> toList();
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
-    method public static java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
+    method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
+    method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
+    method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList();
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
   }
 
   public abstract interface DoubleStream implements java.util.stream.BaseStream {
@@ -66315,7 +66315,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Double> boxed();
     method public static java.util.stream.DoubleStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
     method public abstract long count();
     method public abstract java.util.stream.DoubleStream distinct();
@@ -66333,7 +66333,7 @@
     method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
     method public abstract java.util.OptionalDouble max();
     method public abstract java.util.OptionalDouble min();
     method public abstract boolean noneMatch(java.util.function.DoublePredicate);
@@ -66366,7 +66366,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Integer> boxed();
     method public static java.util.stream.IntStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
     method public abstract long count();
     method public abstract java.util.stream.IntStream distinct();
@@ -66384,7 +66384,7 @@
     method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
     method public abstract java.util.OptionalInt max();
     method public abstract java.util.OptionalInt min();
     method public abstract boolean noneMatch(java.util.function.IntPredicate);
@@ -66418,7 +66418,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Long> boxed();
     method public static java.util.stream.LongStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
     method public abstract long count();
     method public abstract java.util.stream.LongStream distinct();
@@ -66436,7 +66436,7 @@
     method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
     method public abstract java.util.OptionalLong max();
     method public abstract java.util.OptionalLong min();
     method public abstract boolean noneMatch(java.util.function.LongPredicate);
@@ -66463,49 +66463,49 @@
     method public abstract java.util.stream.LongStream build();
   }
 
-  public abstract interface Stream implements java.util.stream.BaseStream {
+  public abstract interface Stream<T> implements java.util.stream.BaseStream {
     method public abstract boolean allMatch(java.util.function.Predicate<? super T>);
     method public abstract boolean anyMatch(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Stream.Builder<T> builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
-    method public abstract R collect(java.util.stream.Collector<? super T, A, R>);
-    method public static java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
+    method public static <T> java.util.stream.Stream.Builder<T> builder();
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>);
+    method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
     method public abstract long count();
     method public abstract java.util.stream.Stream<T> distinct();
-    method public static java.util.stream.Stream<T> empty();
+    method public static <T> java.util.stream.Stream<T> empty();
     method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>);
     method public abstract java.util.Optional<T> findAny();
     method public abstract java.util.Optional<T> findFirst();
-    method public abstract java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
+    method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
     method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>);
     method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>);
     method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>);
     method public abstract void forEach(java.util.function.Consumer<? super T>);
     method public abstract void forEachOrdered(java.util.function.Consumer<? super T>);
-    method public static java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
-    method public static java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
+    method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
+    method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
     method public abstract java.util.stream.Stream<T> limit(long);
-    method public abstract java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
+    method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>);
     method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>);
     method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>);
     method public abstract boolean noneMatch(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Stream<T> of(T);
-    method public static java.util.stream.Stream<T> of(T...);
+    method public static <T> java.util.stream.Stream<T> of(T);
+    method public static <T> java.util.stream.Stream<T> of(T...);
     method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>);
     method public abstract T reduce(T, java.util.function.BinaryOperator<T>);
     method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>);
-    method public abstract U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
+    method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
     method public abstract java.util.stream.Stream<T> skip(long);
     method public abstract java.util.stream.Stream<T> sorted();
     method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>);
     method public abstract java.lang.Object[] toArray();
-    method public abstract A[] toArray(java.util.function.IntFunction<A[]>);
+    method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>);
   }
 
-  public static abstract interface Stream.Builder implements java.util.function.Consumer {
+  public static abstract interface Stream.Builder<T> implements java.util.function.Consumer {
     method public abstract void accept(T);
     method public default java.util.stream.Stream.Builder<T> add(T);
     method public abstract java.util.stream.Stream<T> build();
@@ -66518,8 +66518,8 @@
     method public static java.util.stream.IntStream intStream(java.util.function.Supplier<? extends java.util.Spliterator.OfInt>, int, boolean);
     method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean);
     method public static java.util.stream.LongStream longStream(java.util.function.Supplier<? extends java.util.Spliterator.OfLong>, int, boolean);
-    method public static java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean);
-    method public static java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean);
+    method public static <T> java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean);
+    method public static <T> java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean);
   }
 
 }
@@ -68692,16 +68692,16 @@
   public final class Subject implements java.io.Serializable {
     ctor public Subject();
     ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>);
-    method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>);
-    method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
-    method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
-    method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
+    method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>);
+    method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
+    method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
     method public java.util.Set<java.security.Principal> getPrincipals();
-    method public java.util.Set<T> getPrincipals(java.lang.Class<T>);
+    method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>);
     method public java.util.Set<java.lang.Object> getPrivateCredentials();
-    method public java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
+    method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
     method public java.util.Set<java.lang.Object> getPublicCredentials();
-    method public java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
+    method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
     method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
     method public boolean isReadOnly();
     method public void setReadOnly();
diff --git a/api/test-current.txt b/api/test-current.txt
index a085e0f..1bd9b7b 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2921,11 +2921,11 @@
     field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED";
   }
 
-  public abstract interface AccountManagerCallback {
+  public abstract interface AccountManagerCallback<V> {
     method public abstract void run(android.accounts.AccountManagerFuture<V>);
   }
 
-  public abstract interface AccountManagerFuture {
+  public abstract interface AccountManagerFuture<V> {
     method public abstract boolean cancel(boolean);
     method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
     method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
@@ -3071,7 +3071,7 @@
     method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);
   }
 
-  public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter {
+  public abstract class BidirectionalTypeConverter<T, V> extends android.animation.TypeConverter {
     ctor public BidirectionalTypeConverter(java.lang.Class<T>, java.lang.Class<V>);
     method public abstract T convertBack(V);
     method public android.animation.BidirectionalTypeConverter<V, T> invert();
@@ -3163,26 +3163,26 @@
     method public java.lang.String getPropertyName();
     method public java.lang.Object getTarget();
     method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...);
-    method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
+    method public static <T> android.animation.ObjectAnimator ofArgb(T, android.util.Property<T, java.lang.Integer>, int...);
     method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...);
     method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
-    method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
+    method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, float...);
+    method public static <T> android.animation.ObjectAnimator ofFloat(T, android.util.Property<T, java.lang.Float>, android.util.Property<T, java.lang.Float>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...);
     method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
-    method public static android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
+    method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, int...);
+    method public static <T> android.animation.ObjectAnimator ofInt(T, android.util.Property<T, java.lang.Integer>, android.util.Property<T, java.lang.Integer>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]);
     method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
+    method public static <T> android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, T...);
     method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]);
     method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
+    method public static <T> android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, T...);
     method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
     method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+    method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V, P> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, P>, android.animation.TypeConverter<V, P>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V> android.animation.ObjectAnimator ofObject(T, android.util.Property<T, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
     method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...);
     method public void setAutoCancel(boolean);
     method public void setProperty(android.util.Property);
@@ -3206,17 +3206,17 @@
     method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
     method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+    method public static <V> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<V, float[]>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T> android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter<T, float[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
     method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
+    method public static <V> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<V, int[]>, android.animation.TypeEvaluator<V>, V...);
+    method public static <T> android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter<T, int[]>, android.animation.TypeEvaluator<T>, android.animation.Keyframe...);
     method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...);
     method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter<android.graphics.PointF, ?>, android.graphics.Path);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
-    method public static android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
+    method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator<V>, V...);
+    method public static <T, V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<T, V>, android.animation.TypeEvaluator<T>, T...);
+    method public static <V> android.animation.PropertyValuesHolder ofObject(android.util.Property<?, V>, android.animation.TypeConverter<android.graphics.PointF, V>, android.graphics.Path);
     method public void setConverter(android.animation.TypeConverter);
     method public void setEvaluator(android.animation.TypeEvaluator);
     method public void setFloatValues(float...);
@@ -3253,12 +3253,12 @@
     method public abstract float getInterpolation(float);
   }
 
-  public abstract class TypeConverter {
+  public abstract class TypeConverter<T, V> {
     ctor public TypeConverter(java.lang.Class<T>, java.lang.Class<V>);
     method public abstract V convert(T);
   }
 
-  public abstract interface TypeEvaluator {
+  public abstract interface TypeEvaluator<T> {
     method public abstract T evaluate(float, T, T);
   }
 
@@ -4591,7 +4591,7 @@
     method public android.os.Parcelable saveAllState();
   }
 
-  public abstract class FragmentHostCallback extends android.app.FragmentContainer {
+  public abstract class FragmentHostCallback<E> extends android.app.FragmentContainer {
     ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
     method public void onAttachFragment(android.app.Fragment);
     method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
@@ -4858,12 +4858,12 @@
     method public abstract void destroyLoader(int);
     method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
     method public static void enableDebugLogging(boolean);
-    method public abstract android.content.Loader<D> getLoader(int);
-    method public abstract android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.content.Loader<D> getLoader(int);
+    method public abstract <D> android.content.Loader<D> initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract <D> android.content.Loader<D> restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks<D>);
   }
 
-  public static abstract interface LoaderManager.LoaderCallbacks {
+  public static abstract interface LoaderManager.LoaderCallbacks<D> {
     method public abstract android.content.Loader<D> onCreateLoader(int, android.os.Bundle);
     method public abstract void onLoadFinished(android.content.Loader<D>, D);
     method public abstract void onLoaderReset(android.content.Loader<D>);
@@ -7686,7 +7686,7 @@
     ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper);
   }
 
-  public abstract class AsyncTaskLoader extends android.content.Loader {
+  public abstract class AsyncTaskLoader<D> extends android.content.Loader {
     ctor public AsyncTaskLoader(android.content.Context);
     method public void cancelLoadInBackground();
     method public boolean isLoadInBackgroundCanceled();
@@ -7868,7 +7868,7 @@
     method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
     method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
-    method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
+    method public <T> android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
     method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException;
     method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
@@ -7881,7 +7881,7 @@
     method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
   }
 
-  public static abstract interface ContentProvider.PipeDataWriter {
+  public static abstract interface ContentProvider.PipeDataWriter<T> {
     method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T);
   }
 
@@ -8153,7 +8153,7 @@
     method public final java.lang.String getString(int);
     method public final java.lang.String getString(int, java.lang.Object...);
     method public abstract java.lang.Object getSystemService(java.lang.String);
-    method public final T getSystemService(java.lang.Class<T>);
+    method public final <T> T getSystemService(java.lang.Class<T>);
     method public abstract java.lang.String getSystemServiceName(java.lang.Class<?>);
     method public final java.lang.CharSequence getText(int);
     method public abstract android.content.res.Resources.Theme getTheme();
@@ -8510,8 +8510,8 @@
     method public long getLongExtra(java.lang.String, long);
     method public java.lang.String getPackage();
     method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
-    method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
-    method public T getParcelableExtra(java.lang.String);
+    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
+    method public <T extends android.os.Parcelable> T getParcelableExtra(java.lang.String);
     method public java.lang.String getScheme();
     method public android.content.Intent getSelector();
     method public java.io.Serializable getSerializableExtra(java.lang.String);
@@ -8986,7 +8986,7 @@
     ctor public IntentSender.SendIntentException(java.lang.Exception);
   }
 
-  public class Loader {
+  public class Loader<D> {
     ctor public Loader(android.content.Context);
     method public void abandon();
     method public boolean cancelLoad();
@@ -9023,11 +9023,11 @@
     ctor public Loader.ForceLoadContentObserver();
   }
 
-  public static abstract interface Loader.OnLoadCanceledListener {
+  public static abstract interface Loader.OnLoadCanceledListener<D> {
     method public abstract void onLoadCanceled(android.content.Loader<D>);
   }
 
-  public static abstract interface Loader.OnLoadCompleteListener {
+  public static abstract interface Loader.OnLoadCompleteListener<D> {
     method public abstract void onLoadComplete(android.content.Loader<D>, D);
   }
 
@@ -10904,7 +10904,7 @@
     method public boolean isNull(int);
   }
 
-  public abstract class Observable {
+  public abstract class Observable<T> {
     ctor public Observable();
     method public void registerObserver(T);
     method public void unregisterAll();
@@ -12795,7 +12795,7 @@
   public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable {
     ctor public AnimatedStateListDrawable();
     method public void addState(int[], android.graphics.drawable.Drawable, int);
-    method public void addTransition(int, int, T, boolean);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
   }
 
   public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 {
@@ -13920,7 +13920,7 @@
   }
 
   public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata {
-    method public T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
+    method public <T> T get(android.hardware.camera2.CameraCharacteristics.Key<T>);
     method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
     method public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
     field public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
@@ -14005,7 +14005,7 @@
     field public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Integer> TONEMAP_MAX_CURVE_POINTS;
   }
 
-  public static final class CameraCharacteristics.Key {
+  public static final class CameraCharacteristics.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
@@ -14070,7 +14070,7 @@
     method public void onTorchModeUnavailable(java.lang.String);
   }
 
-  public abstract class CameraMetadata {
+  public abstract class CameraMetadata<TKey> {
     method public java.util.List<TKey> getKeys();
     field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1
     field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2
@@ -14278,7 +14278,7 @@
 
   public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable {
     method public int describeContents();
-    method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
     method public java.lang.Object getTag();
     method public boolean isReprocess();
     method public void writeToParcel(android.os.Parcel, int);
@@ -14341,20 +14341,20 @@
   public static final class CaptureRequest.Builder {
     method public void addTarget(android.view.Surface);
     method public android.hardware.camera2.CaptureRequest build();
-    method public T get(android.hardware.camera2.CaptureRequest.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>);
     method public void removeTarget(android.view.Surface);
-    method public void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
+    method public <T> void set(android.hardware.camera2.CaptureRequest.Key<T>, T);
     method public void setTag(java.lang.Object);
   }
 
-  public static final class CaptureRequest.Key {
+  public static final class CaptureRequest.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
   }
 
   public class CaptureResult extends android.hardware.camera2.CameraMetadata {
-    method public T get(android.hardware.camera2.CaptureResult.Key<T>);
+    method public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
     method public long getFrameNumber();
     method public android.hardware.camera2.CaptureRequest getRequest();
     method public int getSequenceId();
@@ -14435,7 +14435,7 @@
     field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> TONEMAP_PRESET_CURVE;
   }
 
-  public static final class CaptureResult.Key {
+  public static final class CaptureResult.Key<T> {
     method public final boolean equals(java.lang.Object);
     method public java.lang.String getName();
     method public final int hashCode();
@@ -14562,14 +14562,14 @@
     method public android.util.Size[] getInputSizes(int);
     method public final int[] getOutputFormats();
     method public long getOutputMinFrameDuration(int, android.util.Size);
-    method public long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
-    method public android.util.Size[] getOutputSizes(java.lang.Class<T>);
+    method public <T> long getOutputMinFrameDuration(java.lang.Class<T>, android.util.Size);
+    method public <T> android.util.Size[] getOutputSizes(java.lang.Class<T>);
     method public android.util.Size[] getOutputSizes(int);
     method public long getOutputStallDuration(int, android.util.Size);
-    method public long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
+    method public <T> long getOutputStallDuration(java.lang.Class<T>, android.util.Size);
     method public final int[] getValidOutputFormatsForInput(int);
     method public boolean isOutputSupportedFor(int);
-    method public static boolean isOutputSupportedFor(java.lang.Class<T>);
+    method public static <T> boolean isOutputSupportedFor(java.lang.Class<T>);
     method public boolean isOutputSupportedFor(android.view.Surface);
   }
 
@@ -16270,7 +16270,7 @@
 
 package android.icu.text {
 
-  public final class AlphabeticIndex implements java.lang.Iterable {
+  public final class AlphabeticIndex<V> implements java.lang.Iterable {
     ctor public AlphabeticIndex(android.icu.util.ULocale);
     ctor public AlphabeticIndex(java.util.Locale);
     ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator);
@@ -16296,7 +16296,7 @@
     method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(java.lang.String);
   }
 
-  public static class AlphabeticIndex.Bucket implements java.lang.Iterable {
+  public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable {
     method public java.lang.String getLabel();
     method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType();
     method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator();
@@ -16312,14 +16312,14 @@
     enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW;
   }
 
-  public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable {
+  public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable {
     method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int);
     method public int getBucketCount();
     method public int getBucketIndex(java.lang.CharSequence);
     method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
   }
 
-  public static class AlphabeticIndex.Record {
+  public static class AlphabeticIndex.Record<V> {
     method public V getData();
     method public java.lang.CharSequence getName();
   }
@@ -17832,8 +17832,8 @@
     method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet);
     method public android.icu.text.UnicodeSet addAll(java.lang.Iterable<?>);
-    method public android.icu.text.UnicodeSet addAll(T...);
-    method public T addAllTo(T);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...);
+    method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T);
     method public void addMatchSetTo(android.icu.text.UnicodeSet);
     method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int);
     method public final android.icu.text.UnicodeSet applyPattern(java.lang.String);
@@ -17861,15 +17861,15 @@
     method public final boolean contains(java.lang.CharSequence);
     method public boolean containsAll(android.icu.text.UnicodeSet);
     method public boolean containsAll(java.lang.String);
-    method public boolean containsAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> boolean containsAll(java.lang.Iterable<T>);
     method public boolean containsNone(int, int);
     method public boolean containsNone(android.icu.text.UnicodeSet);
     method public boolean containsNone(java.lang.CharSequence);
-    method public boolean containsNone(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> boolean containsNone(java.lang.Iterable<T>);
     method public final boolean containsSome(int, int);
     method public final boolean containsSome(android.icu.text.UnicodeSet);
     method public final boolean containsSome(java.lang.CharSequence);
-    method public final boolean containsSome(java.lang.Iterable<T>);
+    method public final <T extends java.lang.CharSequence> boolean containsSome(java.lang.Iterable<T>);
     method public android.icu.text.UnicodeSet freeze();
     method public static android.icu.text.UnicodeSet from(java.lang.CharSequence);
     method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence);
@@ -17887,14 +17887,14 @@
     method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence);
     method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet);
-    method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(java.lang.Iterable<T>);
     method public final android.icu.text.UnicodeSet removeAllStrings();
     method public android.icu.text.UnicodeSet retain(int, int);
     method public final android.icu.text.UnicodeSet retain(int);
     method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence);
     method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence);
     method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet);
-    method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
+    method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(java.lang.Iterable<T>);
     method public android.icu.text.UnicodeSet set(int, int);
     method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet);
     method public int size();
@@ -18304,7 +18304,7 @@
     method public long getToDate();
   }
 
-  public abstract interface Freezable implements java.lang.Cloneable {
+  public abstract interface Freezable<T> implements java.lang.Cloneable {
     method public abstract T cloneAsThawed();
     method public abstract T freeze();
     method public abstract boolean isFrozen();
@@ -18586,7 +18586,7 @@
     field public static final android.icu.util.TimeUnit YEAR;
   }
 
-  public class Output {
+  public class Output<T> {
     ctor public Output();
     ctor public Output(T);
     field public T value;
@@ -28337,7 +28337,7 @@
 
 package android.os {
 
-  public abstract class AsyncTask {
+  public abstract class AsyncTask<Params, Progress, Result> {
     ctor public AsyncTask();
     method public final boolean cancel(boolean);
     method protected abstract Result doInBackground(Params...);
@@ -28566,16 +28566,16 @@
     method public float getFloat(java.lang.String, float);
     method public float[] getFloatArray(java.lang.String);
     method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(java.lang.String);
-    method public T getParcelable(java.lang.String);
+    method public <T extends android.os.Parcelable> T getParcelable(java.lang.String);
     method public android.os.Parcelable[] getParcelableArray(java.lang.String);
-    method public java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
+    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(java.lang.String);
     method public java.io.Serializable getSerializable(java.lang.String);
     method public short getShort(java.lang.String);
     method public short getShort(java.lang.String, short);
     method public short[] getShortArray(java.lang.String);
     method public android.util.Size getSize(java.lang.String);
     method public android.util.SizeF getSizeF(java.lang.String);
-    method public android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
+    method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(java.lang.String);
     method public java.util.ArrayList<java.lang.String> getStringArrayList(java.lang.String);
     method public boolean hasFileDescriptors();
     method public void putAll(android.os.Bundle);
@@ -29080,8 +29080,8 @@
     method public final long[] createLongArray();
     method public final java.lang.String[] createStringArray();
     method public final java.util.ArrayList<java.lang.String> createStringArrayList();
-    method public final T[] createTypedArray(android.os.Parcelable.Creator<T>);
-    method public final java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
+    method public final <T> T[] createTypedArray(android.os.Parcelable.Creator<T>);
+    method public final <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
     method public final int dataAvail();
     method public final int dataCapacity();
     method public final int dataPosition();
@@ -29114,7 +29114,7 @@
     method public final long readLong();
     method public final void readLongArray(long[]);
     method public final void readMap(java.util.Map, java.lang.ClassLoader);
-    method public final T readParcelable(java.lang.ClassLoader);
+    method public final <T extends android.os.Parcelable> T readParcelable(java.lang.ClassLoader);
     method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
     method public final android.os.PersistableBundle readPersistableBundle();
     method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
@@ -29127,9 +29127,9 @@
     method public final void readStringArray(java.lang.String[]);
     method public final void readStringList(java.util.List<java.lang.String>);
     method public final android.os.IBinder readStrongBinder();
-    method public final void readTypedArray(T[], android.os.Parcelable.Creator<T>);
-    method public final void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
-    method public final T readTypedObject(android.os.Parcelable.Creator<T>);
+    method public final <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
+    method public final <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
+    method public final <T> T readTypedObject(android.os.Parcelable.Creator<T>);
     method public final java.lang.Object readValue(java.lang.ClassLoader);
     method public final void recycle();
     method public final void setDataCapacity(int);
@@ -29160,7 +29160,7 @@
     method public final void writeMap(java.util.Map);
     method public final void writeNoException();
     method public final void writeParcelable(android.os.Parcelable, int);
-    method public final void writeParcelableArray(T[], int);
+    method public final <T extends android.os.Parcelable> void writeParcelableArray(T[], int);
     method public final void writePersistableBundle(android.os.PersistableBundle);
     method public final void writeSerializable(java.io.Serializable);
     method public final void writeSize(android.util.Size);
@@ -29172,9 +29172,9 @@
     method public final void writeStringList(java.util.List<java.lang.String>);
     method public final void writeStrongBinder(android.os.IBinder);
     method public final void writeStrongInterface(android.os.IInterface);
-    method public final void writeTypedArray(T[], int);
-    method public final void writeTypedList(java.util.List<T>);
-    method public final void writeTypedObject(T, int);
+    method public final <T extends android.os.Parcelable> void writeTypedArray(T[], int);
+    method public final <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
+    method public final <T extends android.os.Parcelable> void writeTypedObject(T, int);
     method public final void writeValue(java.lang.Object);
     field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
   }
@@ -29252,11 +29252,11 @@
     field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
   }
 
-  public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator {
+  public static abstract interface Parcelable.ClassLoaderCreator<T> implements android.os.Parcelable.Creator {
     method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
   }
 
-  public static abstract interface Parcelable.Creator {
+  public static abstract interface Parcelable.Creator<T> {
     method public abstract T createFromParcel(android.os.Parcel);
     method public abstract T[] newArray(int);
   }
@@ -29372,7 +29372,7 @@
     method public abstract void onProgress(int);
   }
 
-  public class RemoteCallbackList {
+  public class RemoteCallbackList<E extends android.os.IInterface> {
     ctor public RemoteCallbackList();
     method public int beginBroadcast();
     method public void finishBroadcast();
@@ -34706,7 +34706,7 @@
     field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService";
   }
 
-  public static abstract interface CarrierMessagingService.ResultCallback {
+  public static abstract interface CarrierMessagingService.ResultCallback<T> {
     method public abstract void onReceiveResult(T) throws android.os.RemoteException;
   }
 
@@ -34858,7 +34858,7 @@
     field public static final java.lang.String EXTRA_SUGGESTION_KEYWORDS = "android.service.media.extra.SUGGESTION_KEYWORDS";
   }
 
-  public class MediaBrowserService.Result {
+  public class MediaBrowserService.Result<T> {
     method public void detach();
     method public void sendResult(T);
   }
@@ -37786,14 +37786,14 @@
 
 package android.test {
 
-  public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>);
     ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class<T>, boolean);
     method public T getActivity();
     method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
   }
 
-  public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class<T>);
     ctor public ActivityInstrumentationTestCase2(java.lang.Class<T>);
     method public T getActivity();
@@ -37808,7 +37808,7 @@
     method protected void setActivity(android.app.Activity);
   }
 
-  public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase {
+  public abstract deprecated class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
     ctor public ActivityUnitTestCase(java.lang.Class<T>);
     method public T getActivity();
     method public int getFinishedActivityRequest();
@@ -37854,7 +37854,7 @@
     method public void testStarted(java.lang.String);
   }
 
-  public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase {
+  public abstract deprecated class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
     ctor public ApplicationTestCase(java.lang.Class<T>);
     method protected final void createApplication();
     method public T getApplication();
@@ -37880,8 +37880,8 @@
     method public android.app.Instrumentation getInstrumentation();
     method public deprecated void injectInsrumentation(android.app.Instrumentation);
     method public void injectInstrumentation(android.app.Instrumentation);
-    method public final T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
-    method public final T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
+    method public final <T extends android.app.Activity> T launchActivity(java.lang.String, java.lang.Class<T>, android.os.Bundle);
+    method public final <T extends android.app.Activity> T launchActivityWithIntent(java.lang.String, java.lang.Class<T>, android.content.Intent);
     method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable;
     method public void sendKeys(java.lang.String);
     method public void sendKeys(int...);
@@ -37921,7 +37921,7 @@
 
   public class LoaderTestCase extends android.test.AndroidTestCase {
     ctor public LoaderTestCase();
-    method public T getLoaderResultSynchronously(android.content.Loader<T>);
+    method public <T> T getLoaderResultSynchronously(android.content.Loader<T>);
   }
 
   public final deprecated class MoreAsserts {
@@ -37976,20 +37976,20 @@
     method public abstract void startTiming(boolean);
   }
 
-  public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase {
+  public abstract deprecated class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
     ctor public ProviderTestCase(java.lang.Class<T>, java.lang.String);
     method public android.test.mock.MockContentResolver getMockContentResolver();
     method public android.test.IsolatedContext getMockContext();
     method public T getProvider();
-    method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
-  public abstract class ProviderTestCase2 extends android.test.AndroidTestCase {
+  public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase {
     ctor public ProviderTestCase2(java.lang.Class<T>, java.lang.String);
     method public android.test.mock.MockContentResolver getMockContentResolver();
     method public android.test.IsolatedContext getMockContext();
     method public T getProvider();
-    method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class<T>, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
   public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper {
@@ -37997,11 +37997,11 @@
     ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String);
     method public java.lang.String getDatabasePrefix();
     method public void makeExistingFilesAndDbsAccessible();
-    method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
-    method public static T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
+    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(java.lang.Class<T>, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
   }
 
-  public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase {
+  public abstract deprecated class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
     ctor public ServiceTestCase(java.lang.Class<T>);
     method protected android.os.IBinder bindService(android.content.Intent);
     method public android.app.Application getApplication();
@@ -38014,7 +38014,7 @@
     method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
   }
 
-  public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase {
+  public abstract deprecated class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
     ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class<T>);
     method public T getActivity();
     method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
@@ -38371,7 +38371,7 @@
     ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
     ctor public TestMethod(junit.framework.TestCase);
     method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.Class<? extends junit.framework.TestCase> getEnclosingClass();
     method public java.lang.String getEnclosingClassname();
     method public java.lang.String getName();
@@ -38819,7 +38819,7 @@
     method public int getSpanEnd(java.lang.Object);
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
-    method public T[] getSpans(int, int, java.lang.Class<T>);
+    method public <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint);
     method public int getTextWatcherDepth();
     method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int);
@@ -38841,7 +38841,7 @@
     method public int getSpanEnd(java.lang.Object);
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
-    method public T[] getSpans(int, int, java.lang.Class<T>);
+    method public <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public final int length();
     method public int nextSpanTransition(int, int, java.lang.Class);
     method public final java.lang.String toString();
@@ -38851,7 +38851,7 @@
     method public abstract int getSpanEnd(java.lang.Object);
     method public abstract int getSpanFlags(java.lang.Object);
     method public abstract int getSpanStart(java.lang.Object);
-    method public abstract T[] getSpans(int, int, java.lang.Class<T>);
+    method public abstract <T> T[] getSpans(int, int, java.lang.Class<T>);
     method public abstract int nextSpanTransition(int, int, java.lang.Class);
     field public static final int SPAN_COMPOSING = 256; // 0x100
     field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21
@@ -39829,7 +39829,7 @@
     field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
   }
 
-  public static class TtsSpan.Builder {
+  public static class TtsSpan.Builder<C extends android.text.style.TtsSpan.Builder<?>> {
     ctor public TtsSpan.Builder(java.lang.String);
     method public android.text.style.TtsSpan build();
     method public C setIntArgument(java.lang.String, int);
@@ -39925,7 +39925,7 @@
     method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String);
   }
 
-  public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder {
+  public static class TtsSpan.SemioticClassBuilder<C extends android.text.style.TtsSpan.SemioticClassBuilder<?>> extends android.text.style.TtsSpan.Builder {
     ctor public TtsSpan.SemioticClassBuilder(java.lang.String);
     method public C setAnimacy(java.lang.String);
     method public C setCase(java.lang.String);
@@ -40333,7 +40333,7 @@
     ctor public AndroidRuntimeException(java.lang.Exception);
   }
 
-  public final class ArrayMap implements java.util.Map {
+  public final class ArrayMap<K, V> implements java.util.Map {
     ctor public ArrayMap();
     ctor public ArrayMap(int);
     ctor public ArrayMap(android.util.ArrayMap<K, V>);
@@ -40361,7 +40361,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public final class ArraySet implements java.util.Collection java.util.Set {
+  public final class ArraySet<E> implements java.util.Collection java.util.Set {
     ctor public ArraySet();
     ctor public ArraySet(int);
     ctor public ArraySet(android.util.ArraySet<E>);
@@ -40382,7 +40382,7 @@
     method public boolean retainAll(java.util.Collection<?>);
     method public int size();
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
     method public E valueAt(int);
   }
 
@@ -40527,13 +40527,13 @@
   public deprecated class FloatMath {
   }
 
-  public abstract class FloatProperty extends android.util.Property {
+  public abstract class FloatProperty<T> extends android.util.Property {
     ctor public FloatProperty(java.lang.String);
     method public final void set(T, java.lang.Float);
     method public abstract void setValue(T, float);
   }
 
-  public abstract class IntProperty extends android.util.Property {
+  public abstract class IntProperty<T> extends android.util.Property {
     ctor public IntProperty(java.lang.String);
     method public final void set(T, java.lang.Integer);
     method public abstract void setValue(T, int);
@@ -40633,7 +40633,7 @@
     method public void println(java.lang.String);
   }
 
-  public class LongSparseArray implements java.lang.Cloneable {
+  public class LongSparseArray<E> implements java.lang.Cloneable {
     ctor public LongSparseArray();
     ctor public LongSparseArray(int);
     method public void append(long, E);
@@ -40654,7 +40654,7 @@
     method public E valueAt(int);
   }
 
-  public class LruCache {
+  public class LruCache<K, V> {
     ctor public LruCache(int);
     method protected V create(K);
     method public final synchronized int createCount();
@@ -40742,9 +40742,9 @@
     ctor public NoSuchPropertyException(java.lang.String);
   }
 
-  public class Pair {
+  public class Pair<F, S> {
     ctor public Pair(F, S);
-    method public static android.util.Pair<A, B> create(A, B);
+    method public static <A, B> android.util.Pair<A, B> create(A, B);
     field public final F first;
     field public final S second;
   }
@@ -40777,22 +40777,22 @@
     method public abstract void println(java.lang.String);
   }
 
-  public abstract class Property {
+  public abstract class Property<T, V> {
     ctor public Property(java.lang.Class<V>, java.lang.String);
     method public abstract V get(T);
     method public java.lang.String getName();
     method public java.lang.Class<V> getType();
     method public boolean isReadOnly();
-    method public static android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
+    method public static <T, V> android.util.Property<T, V> of(java.lang.Class<T>, java.lang.Class<V>, java.lang.String);
     method public void set(T, V);
   }
 
-  public final class Range {
+  public final class Range<T extends java.lang.Comparable<? super T>> {
     ctor public Range(T, T);
     method public T clamp(T);
     method public boolean contains(T);
     method public boolean contains(android.util.Range<T>);
-    method public static android.util.Range<T> create(T, T);
+    method public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> create(T, T);
     method public android.util.Range<T> extend(android.util.Range<T>);
     method public android.util.Range<T> extend(T, T);
     method public android.util.Range<T> extend(T);
@@ -40836,7 +40836,7 @@
     method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException;
   }
 
-  public class SparseArray implements java.lang.Cloneable {
+  public class SparseArray<E> implements java.lang.Cloneable {
     ctor public SparseArray();
     ctor public SparseArray(int);
     method public void append(int, E);
@@ -45575,7 +45575,7 @@
     method public static java.lang.String stripAnchor(java.lang.String);
   }
 
-  public abstract interface ValueCallback {
+  public abstract interface ValueCallback<T> {
     method public abstract void onReceiveValue(T);
   }
 
@@ -46309,7 +46309,7 @@
     field public static final int NO_SELECTION = -2147483648; // 0x80000000
   }
 
-  public abstract class AdapterView extends android.view.ViewGroup {
+  public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup {
     ctor public AdapterView(android.content.Context);
     ctor public AdapterView(android.content.Context, android.util.AttributeSet);
     ctor public AdapterView(android.content.Context, android.util.AttributeSet, int);
@@ -46432,7 +46432,7 @@
     ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
   }
 
-  public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
+  public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
     ctor public ArrayAdapter(android.content.Context, int);
     ctor public ArrayAdapter(android.content.Context, int, int);
     ctor public ArrayAdapter(android.content.Context, int, T[]);
@@ -46493,7 +46493,7 @@
     method protected void performFiltering(java.lang.CharSequence, int);
     method public void performValidation();
     method protected void replaceText(java.lang.CharSequence);
-    method public void setAdapter(T);
+    method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T);
     method public void setCompletionHint(java.lang.CharSequence);
     method public void setDropDownAnchor(int);
     method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -48793,7 +48793,7 @@
 
 package com.android.internal.util {
 
-  public abstract interface Predicate {
+  public abstract interface Predicate<T> {
     method public abstract boolean apply(T);
   }
 
@@ -50865,22 +50865,22 @@
     enum_constant public static final java.lang.Character.UnicodeScript YI;
   }
 
-  public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
-    method public java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
+  public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
+    method public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U>);
     method public T cast(java.lang.Object);
     method public boolean desiredAssertionStatus();
     method public static java.lang.Class<?> forName(java.lang.String) throws java.lang.ClassNotFoundException;
     method public static java.lang.Class<?> forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException;
-    method public A getAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getAnnotations();
-    method public A[] getAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
     method public java.lang.String getCanonicalName();
     method public java.lang.ClassLoader getClassLoader();
     method public java.lang.Class<?>[] getClasses();
     method public java.lang.Class<?> getComponentType();
     method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
     method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException;
-    method public A getDeclaredAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public java.lang.Class<?>[] getDeclaredClasses();
     method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
@@ -50992,7 +50992,7 @@
   public abstract interface Cloneable {
   }
 
-  public abstract interface Comparable {
+  public abstract interface Comparable<T> {
     method public abstract int compareTo(T);
   }
 
@@ -51046,7 +51046,7 @@
     field public static final java.lang.Class<java.lang.Double> TYPE;
   }
 
-  public abstract class Enum implements java.lang.Comparable java.io.Serializable {
+  public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable java.io.Serializable {
     ctor protected Enum(java.lang.String, int);
     method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException;
     method public final int compareTo(E);
@@ -51056,7 +51056,7 @@
     method public final int hashCode();
     method public final java.lang.String name();
     method public final int ordinal();
-    method public static T valueOf(java.lang.Class<T>, java.lang.String);
+    method public static <T extends java.lang.Enum<T>> T valueOf(java.lang.Class<T>, java.lang.String);
   }
 
   public class EnumConstantNotPresentException extends java.lang.RuntimeException {
@@ -51175,7 +51175,7 @@
     ctor public IndexOutOfBoundsException(java.lang.String);
   }
 
-  public class InheritableThreadLocal extends java.lang.ThreadLocal {
+  public class InheritableThreadLocal<T> extends java.lang.ThreadLocal {
     ctor public InheritableThreadLocal();
     method protected T childValue(T);
   }
@@ -51254,7 +51254,7 @@
     ctor public InterruptedException(java.lang.String);
   }
 
-  public abstract interface Iterable {
+  public abstract interface Iterable<T> {
     method public default void forEach(java.util.function.Consumer<? super T>);
     method public abstract java.util.Iterator<T> iterator();
     method public default java.util.Spliterator<T> spliterator();
@@ -51469,12 +51469,12 @@
   }
 
   public class Package implements java.lang.reflect.AnnotatedElement {
-    method public A getAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getAnnotations();
-    method public A[] getAnnotationsByType(java.lang.Class<A>);
-    method public A getDeclaredAnnotation(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A>);
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
+    method public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A>);
     method public java.lang.String getImplementationTitle();
     method public java.lang.String getImplementationVendor();
     method public java.lang.String getImplementationVersion();
@@ -52073,13 +52073,13 @@
     method public void uncaughtException(java.lang.Thread, java.lang.Throwable);
   }
 
-  public class ThreadLocal {
+  public class ThreadLocal<T> {
     ctor public ThreadLocal();
     method public T get();
     method protected T initialValue();
     method public void remove();
     method public void set(T);
-    method public static java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
+    method public static <S> java.lang.ThreadLocal<S> withInitial(java.util.function.Supplier<? extends S>);
   }
 
   public class Throwable implements java.io.Serializable {
@@ -52217,30 +52217,30 @@
 
 package java.lang.ref {
 
-  public class PhantomReference extends java.lang.ref.Reference {
+  public class PhantomReference<T> extends java.lang.ref.Reference {
     ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
 
-  public abstract class Reference {
+  public abstract class Reference<T> {
     method public void clear();
     method public boolean enqueue();
     method public T get();
     method public boolean isEnqueued();
   }
 
-  public class ReferenceQueue {
+  public class ReferenceQueue<T> {
     ctor public ReferenceQueue();
     method public java.lang.ref.Reference<? extends T> poll();
     method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException;
     method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException;
   }
 
-  public class SoftReference extends java.lang.ref.Reference {
+  public class SoftReference<T> extends java.lang.ref.Reference {
     ctor public SoftReference(T);
     ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
 
-  public class WeakReference extends java.lang.ref.Reference {
+  public class WeakReference<T> extends java.lang.ref.Reference {
     ctor public WeakReference(T);
     ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>);
   }
@@ -52251,7 +52251,7 @@
 
   public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
     ctor protected AccessibleObject();
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.annotation.Annotation[] getAnnotations();
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public boolean isAccessible();
@@ -52260,12 +52260,12 @@
   }
 
   public abstract interface AnnotatedElement {
-    method public abstract T getAnnotation(java.lang.Class<T>);
+    method public abstract <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public abstract java.lang.annotation.Annotation[] getAnnotations();
-    method public default T[] getAnnotationsByType(java.lang.Class<T>);
-    method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class<T>);
     method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations();
-    method public default T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
+    method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(java.lang.Class<T>);
     method public default boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation>);
   }
 
@@ -52293,7 +52293,7 @@
     method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
   }
 
-  public final class Constructor extends java.lang.reflect.Executable {
+  public final class Constructor<T> extends java.lang.reflect.Executable {
     method public java.lang.Class<T> getDeclaringClass();
     method public java.lang.Class<?>[] getExceptionTypes();
     method public int getModifiers();
@@ -52441,7 +52441,7 @@
   }
 
   public final class Parameter implements java.lang.reflect.AnnotatedElement {
-    method public T getAnnotation(java.lang.Class<T>);
+    method public <T extends java.lang.annotation.Annotation> T getAnnotation(java.lang.Class<T>);
     method public java.lang.annotation.Annotation[] getAnnotations();
     method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
     method public java.lang.reflect.Executable getDeclaringExecutable();
@@ -52478,7 +52478,7 @@
   public abstract interface Type {
   }
 
-  public abstract interface TypeVariable implements java.lang.reflect.Type {
+  public abstract interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> implements java.lang.reflect.Type {
     method public abstract java.lang.reflect.Type[] getBounds();
     method public abstract D getGenericDeclaration();
     method public abstract java.lang.String getName();
@@ -53267,7 +53267,7 @@
     method public abstract java.net.SocketImpl createSocketImpl();
   }
 
-  public abstract interface SocketOption {
+  public abstract interface SocketOption<T> {
     method public abstract java.lang.String name();
     method public abstract java.lang.Class<T> type();
   }
@@ -53799,9 +53799,9 @@
   }
 
   public abstract interface AsynchronousByteChannel implements java.nio.channels.AsynchronousChannel {
-    method public abstract void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
-    method public abstract void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
   }
 
@@ -53829,25 +53829,25 @@
   public abstract class AsynchronousFileChannel implements java.nio.channels.AsynchronousChannel {
     ctor protected AsynchronousFileChannel();
     method public abstract void force(boolean) throws java.io.IOException;
-    method public abstract void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
-    method public final void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+    method public abstract <A> void lock(long, long, boolean, A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
+    method public final <A> void lock(A, java.nio.channels.CompletionHandler<java.nio.channels.FileLock, ? super A>);
     method public abstract java.util.concurrent.Future<java.nio.channels.FileLock> lock(long, long, boolean);
     method public final java.util.concurrent.Future<java.nio.channels.FileLock> lock();
     method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set<? extends java.nio.file.OpenOption>, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
-    method public abstract void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer, long);
     method public abstract long size() throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousFileChannel truncate(long) throws java.io.IOException;
     method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException;
     method public final java.nio.channels.FileLock tryLock() throws java.io.IOException;
-    method public abstract void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, long, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer, long);
   }
 
   public abstract class AsynchronousServerSocketChannel implements java.nio.channels.AsynchronousChannel java.nio.channels.NetworkChannel {
     ctor protected AsynchronousServerSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
-    method public abstract void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
+    method public abstract <A> void accept(A, java.nio.channels.CompletionHandler<java.nio.channels.AsynchronousSocketChannel, ? super A>);
     method public abstract java.util.concurrent.Future<java.nio.channels.AsynchronousSocketChannel> accept();
     method public final java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
@@ -53855,30 +53855,30 @@
     method public static java.nio.channels.AsynchronousServerSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousServerSocketChannel open() throws java.io.IOException;
     method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
-    method public abstract java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.AsynchronousServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
   }
 
   public abstract class AsynchronousSocketChannel implements java.nio.channels.AsynchronousByteChannel java.nio.channels.NetworkChannel {
     ctor protected AsynchronousSocketChannel(java.nio.channels.spi.AsynchronousChannelProvider);
     method public abstract java.nio.channels.AsynchronousSocketChannel bind(java.net.SocketAddress) throws java.io.IOException;
-    method public abstract void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
+    method public abstract <A> void connect(java.net.SocketAddress, A, java.nio.channels.CompletionHandler<java.lang.Void, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Void> connect(java.net.SocketAddress);
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
     method public abstract java.net.SocketAddress getRemoteAddress() throws java.io.IOException;
     method public static java.nio.channels.AsynchronousSocketChannel open(java.nio.channels.AsynchronousChannelGroup) throws java.io.IOException;
     method public static java.nio.channels.AsynchronousSocketChannel open() throws java.io.IOException;
     method public final java.nio.channels.spi.AsynchronousChannelProvider provider();
-    method public abstract void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
-    method public final void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void read(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public final <A> void read(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> read(java.nio.ByteBuffer);
-    method public abstract void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
-    method public abstract java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <A> void read(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+    method public abstract <T> java.nio.channels.AsynchronousSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousSocketChannel shutdownInput() throws java.io.IOException;
     method public abstract java.nio.channels.AsynchronousSocketChannel shutdownOutput() throws java.io.IOException;
-    method public abstract void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
-    method public final void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
+    method public final <A> void write(java.nio.ByteBuffer, A, java.nio.channels.CompletionHandler<java.lang.Integer, ? super A>);
     method public abstract java.util.concurrent.Future<java.lang.Integer> write(java.nio.ByteBuffer);
-    method public abstract void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
+    method public abstract <A> void write(java.nio.ByteBuffer[], int, int, long, java.util.concurrent.TimeUnit, A, java.nio.channels.CompletionHandler<java.lang.Long, ? super A>);
   }
 
   public abstract interface ByteChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel {
@@ -53918,7 +53918,7 @@
     ctor public ClosedSelectorException();
   }
 
-  public abstract interface CompletionHandler {
+  public abstract interface CompletionHandler<V, A> {
     method public abstract void completed(V, A);
     method public abstract void failed(java.lang.Throwable, A);
   }
@@ -53942,7 +53942,7 @@
     method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
     method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException;
     method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException;
-    method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.DatagramChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.net.DatagramSocket socket();
     method public final int validOps();
     method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException;
@@ -54047,8 +54047,8 @@
   public abstract interface NetworkChannel implements java.nio.channels.Channel {
     method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException;
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
-    method public abstract T getOption(java.net.SocketOption<T>) throws java.io.IOException;
-    method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> T getOption(java.net.SocketOption<T>) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.NetworkChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.util.Set<java.net.SocketOption<?>> supportedOptions();
   }
 
@@ -54170,7 +54170,7 @@
     method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException;
     method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException;
     method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException;
-    method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.net.ServerSocket socket();
     method public final int validOps();
   }
@@ -54193,7 +54193,7 @@
     method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException;
     method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
     method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
-    method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
+    method public abstract <T> java.nio.channels.SocketChannel setOption(java.net.SocketOption<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException;
     method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException;
     method public abstract java.net.Socket socket();
@@ -54478,11 +54478,11 @@
     ctor public DirectoryNotEmptyException(java.lang.String);
   }
 
-  public abstract interface DirectoryStream implements java.io.Closeable java.lang.Iterable {
+  public abstract interface DirectoryStream<T> implements java.io.Closeable java.lang.Iterable {
     method public abstract java.util.Iterator<T> iterator();
   }
 
-  public static abstract interface DirectoryStream.Filter {
+  public static abstract interface DirectoryStream.Filter<T> {
     method public abstract boolean accept(T) throws java.io.IOException;
   }
 
@@ -54494,7 +54494,7 @@
   public abstract class FileStore {
     ctor protected FileStore();
     method public abstract java.lang.Object getAttribute(java.lang.String) throws java.io.IOException;
-    method public abstract V getFileStoreAttributeView(java.lang.Class<V>);
+    method public abstract <V extends java.nio.file.attribute.FileStoreAttributeView> V getFileStoreAttributeView(java.lang.Class<V>);
     method public abstract long getTotalSpace() throws java.io.IOException;
     method public abstract long getUnallocatedSpace() throws java.io.IOException;
     method public abstract long getUsableSpace() throws java.io.IOException;
@@ -54566,7 +54566,7 @@
     enum_constant public static final java.nio.file.FileVisitResult TERMINATE;
   }
 
-  public abstract interface FileVisitor {
+  public abstract interface FileVisitor<T> {
     method public abstract java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
     method public abstract java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
     method public abstract java.nio.file.FileVisitResult visitFile(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -54591,7 +54591,7 @@
     method public static boolean exists(java.nio.file.Path, java.nio.file.LinkOption...);
     method public static java.util.stream.Stream<java.nio.file.Path> find(java.nio.file.Path, int, java.util.function.BiPredicate<java.nio.file.Path, java.nio.file.attribute.BasicFileAttributes>, java.nio.file.FileVisitOption...) throws java.io.IOException;
     method public static java.lang.Object getAttribute(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
-    method public static V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public static <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public static java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
     method public static java.nio.file.attribute.FileTime getLastModifiedTime(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.nio.file.attribute.UserPrincipal getOwner(java.nio.file.Path, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -54624,7 +54624,7 @@
     method public static byte[] readAllBytes(java.nio.file.Path) throws java.io.IOException;
     method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path, java.nio.charset.Charset) throws java.io.IOException;
     method public static java.util.List<java.lang.String> readAllLines(java.nio.file.Path) throws java.io.IOException;
-    method public static A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+    method public static <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
     method public static java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
     method public static java.nio.file.Path setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -54732,17 +54732,17 @@
     ctor public ReadOnlyFileSystemException();
   }
 
-  public abstract interface SecureDirectoryStream implements java.nio.file.DirectoryStream {
+  public abstract interface SecureDirectoryStream<T> implements java.nio.file.DirectoryStream {
     method public abstract void deleteDirectory(T) throws java.io.IOException;
     method public abstract void deleteFile(T) throws java.io.IOException;
-    method public abstract V getFileAttributeView(java.lang.Class<V>);
-    method public abstract V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.lang.Class<V>);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(T, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public abstract void move(T, java.nio.file.SecureDirectoryStream<T>, T) throws java.io.IOException;
     method public abstract java.nio.channels.SeekableByteChannel newByteChannel(T, java.util.Set<? extends java.nio.file.OpenOption>, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public abstract java.nio.file.SecureDirectoryStream<T> newDirectoryStream(T, java.nio.file.LinkOption...) throws java.io.IOException;
   }
 
-  public class SimpleFileVisitor implements java.nio.file.FileVisitor {
+  public class SimpleFileVisitor<T> implements java.nio.file.FileVisitor {
     ctor protected SimpleFileVisitor();
     method public java.nio.file.FileVisitResult postVisitDirectory(T, java.io.IOException) throws java.io.IOException;
     method public java.nio.file.FileVisitResult preVisitDirectory(T, java.nio.file.attribute.BasicFileAttributes) throws java.io.IOException;
@@ -54780,13 +54780,13 @@
     field public static final java.nio.file.WatchEvent.Kind<java.lang.Object> OVERFLOW;
   }
 
-  public abstract interface WatchEvent {
+  public abstract interface WatchEvent<T> {
     method public abstract T context();
     method public abstract int count();
     method public abstract java.nio.file.WatchEvent.Kind<T> kind();
   }
 
-  public static abstract interface WatchEvent.Kind {
+  public static abstract interface WatchEvent.Kind<T> {
     method public abstract java.lang.String name();
     method public abstract java.lang.Class<T> type();
   }
@@ -54922,7 +54922,7 @@
     method public abstract boolean isSystem();
   }
 
-  public abstract interface FileAttribute {
+  public abstract interface FileAttribute<T> {
     method public abstract java.lang.String name();
     method public abstract T value();
   }
@@ -55019,7 +55019,7 @@
     method public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute<?>...) throws java.io.IOException;
     method public abstract void delete(java.nio.file.Path) throws java.io.IOException;
     method public boolean deleteIfExists(java.nio.file.Path) throws java.io.IOException;
-    method public abstract V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
+    method public abstract <V extends java.nio.file.attribute.FileAttributeView> V getFileAttributeView(java.nio.file.Path, java.lang.Class<V>, java.nio.file.LinkOption...);
     method public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path) throws java.io.IOException;
     method public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
     method public abstract java.nio.file.Path getPath(java.net.URI);
@@ -55036,7 +55036,7 @@
     method public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map<java.lang.String, ?>) throws java.io.IOException;
     method public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
     method public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption...) throws java.io.IOException;
-    method public abstract A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
+    method public abstract <A extends java.nio.file.attribute.BasicFileAttributes> A readAttributes(java.nio.file.Path, java.lang.Class<A>, java.nio.file.LinkOption...) throws java.io.IOException;
     method public abstract java.util.Map<java.lang.String, java.lang.Object> readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption...) throws java.io.IOException;
     method public java.nio.file.Path readSymbolicLink(java.nio.file.Path) throws java.io.IOException;
     method public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption...) throws java.io.IOException;
@@ -55066,12 +55066,12 @@
 
   public final class AccessController {
     method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException;
-    method public static T doPrivileged(java.security.PrivilegedAction<T>);
-    method public static T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
-    method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
-    method public static T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
-    method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>);
-    method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>);
+    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
+    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
+    method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedAction<T>);
+    method public static <T> T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
     method public static java.security.AccessControlContext getContext();
   }
 
@@ -55110,7 +55110,7 @@
     method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
-    method public final T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+    method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
     method public final java.security.Provider getProvider();
     method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
     method public final void init(byte[]) throws java.io.IOException;
@@ -55122,7 +55122,7 @@
     ctor public AlgorithmParametersSpi();
     method protected abstract byte[] engineGetEncoded() throws java.io.IOException;
     method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException;
-    method protected abstract T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
+    method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(java.lang.Class<T>) throws java.security.spec.InvalidParameterSpecException;
     method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
     method protected abstract void engineInit(byte[]) throws java.io.IOException;
     method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException;
@@ -55314,7 +55314,7 @@
     method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException;
     method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
     method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
-    method public final T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+    method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
     method public final java.security.Provider getProvider();
     method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException;
   }
@@ -55323,7 +55323,7 @@
     ctor public KeyFactorySpi();
     method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
     method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
-    method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
+    method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, java.lang.Class<T>) throws java.security.spec.InvalidKeySpecException;
     method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException;
   }
 
@@ -55611,7 +55611,7 @@
     field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L
   }
 
-  public abstract interface PrivilegedAction {
+  public abstract interface PrivilegedAction<T> {
     method public abstract T run();
   }
 
@@ -55620,7 +55620,7 @@
     method public java.lang.Exception getException();
   }
 
-  public abstract interface PrivilegedExceptionAction {
+  public abstract interface PrivilegedExceptionAction<T> {
     method public abstract T run() throws java.lang.Exception;
   }
 
@@ -57814,11 +57814,11 @@
     method public abstract void free() throws java.sql.SQLException;
     method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException;
     method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException;
-    method public abstract T getSource(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T extends javax.xml.transform.Source> T getSource(java.lang.Class<T>) throws java.sql.SQLException;
     method public abstract java.lang.String getString() throws java.sql.SQLException;
     method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException;
     method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException;
-    method public abstract T setResult(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T extends javax.xml.transform.Result> T setResult(java.lang.Class<T>) throws java.sql.SQLException;
     method public abstract void setString(java.lang.String) throws java.sql.SQLException;
   }
 
@@ -57942,7 +57942,7 @@
 
   public abstract interface Wrapper {
     method public abstract boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
-    method public abstract T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
+    method public abstract <T> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
   }
 
 }
@@ -58475,7 +58475,7 @@
 
 package java.util {
 
-  public abstract class AbstractCollection implements java.util.Collection {
+  public abstract class AbstractCollection<E> implements java.util.Collection {
     ctor protected AbstractCollection();
     method public boolean add(E);
     method public boolean addAll(java.util.Collection<? extends E>);
@@ -58489,10 +58489,10 @@
     method public boolean retainAll(java.util.Collection<?>);
     method public abstract int size();
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
   }
 
-  public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List {
+  public abstract class AbstractList<E> extends java.util.AbstractCollection implements java.util.List {
     ctor protected AbstractList();
     method public void add(int, E);
     method public boolean addAll(int, java.util.Collection<? extends E>);
@@ -58509,7 +58509,7 @@
     field protected transient int modCount;
   }
 
-  public abstract class AbstractMap implements java.util.Map {
+  public abstract class AbstractMap<K, V> implements java.util.Map {
     ctor protected AbstractMap();
     method public void clear();
     method public boolean containsKey(java.lang.Object);
@@ -58525,7 +58525,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable {
+  public static class AbstractMap.SimpleEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
     ctor public AbstractMap.SimpleEntry(K, V);
     ctor public AbstractMap.SimpleEntry(java.util.Map.Entry<? extends K, ? extends V>);
     method public K getKey();
@@ -58533,7 +58533,7 @@
     method public V setValue(V);
   }
 
-  public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable {
+  public static class AbstractMap.SimpleImmutableEntry<K, V> implements java.util.Map.Entry java.io.Serializable {
     ctor public AbstractMap.SimpleImmutableEntry(K, V);
     ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry<? extends K, ? extends V>);
     method public K getKey();
@@ -58541,23 +58541,23 @@
     method public V setValue(V);
   }
 
-  public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue {
+  public abstract class AbstractQueue<E> extends java.util.AbstractCollection implements java.util.Queue {
     ctor protected AbstractQueue();
     method public E element();
     method public E remove();
   }
 
-  public abstract class AbstractSequentialList extends java.util.AbstractList {
+  public abstract class AbstractSequentialList<E> extends java.util.AbstractList {
     ctor protected AbstractSequentialList();
     method public E get(int);
     method public abstract java.util.ListIterator<E> listIterator(int);
   }
 
-  public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set {
+  public abstract class AbstractSet<E> extends java.util.AbstractCollection implements java.util.Set {
     ctor protected AbstractSet();
   }
 
-  public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
+  public class ArrayDeque<E> extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable {
     ctor public ArrayDeque();
     ctor public ArrayDeque(int);
     ctor public ArrayDeque(java.util.Collection<? extends E>);
@@ -58589,7 +58589,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class ArrayList<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public ArrayList(int);
     ctor public ArrayList();
     ctor public ArrayList(java.util.Collection<? extends E>);
@@ -58606,7 +58606,7 @@
   }
 
   public class Arrays {
-    method public static java.util.List<T> asList(T...);
+    method public static <T> java.util.List<T> asList(T...);
     method public static int binarySearch(long[], long);
     method public static int binarySearch(long[], int, int, long);
     method public static int binarySearch(int[], int);
@@ -58623,10 +58623,10 @@
     method public static int binarySearch(float[], int, int, float);
     method public static int binarySearch(java.lang.Object[], java.lang.Object);
     method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object);
-    method public static int binarySearch(T[], T, java.util.Comparator<? super T>);
-    method public static int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
-    method public static T[] copyOf(T[], int);
-    method public static T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
+    method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>);
+    method public static <T> int binarySearch(T[], int, int, T, java.util.Comparator<? super T>);
+    method public static <T> T[] copyOf(T[], int);
+    method public static <T, U> T[] copyOf(U[], int, java.lang.Class<? extends T[]>);
     method public static byte[] copyOf(byte[], int);
     method public static short[] copyOf(short[], int);
     method public static int[] copyOf(int[], int);
@@ -58635,8 +58635,8 @@
     method public static float[] copyOf(float[], int);
     method public static double[] copyOf(double[], int);
     method public static boolean[] copyOf(boolean[], int);
-    method public static T[] copyOfRange(T[], int, int);
-    method public static T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
+    method public static <T> T[] copyOfRange(T[], int, int);
+    method public static <T, U> T[] copyOfRange(U[], int, int, java.lang.Class<? extends T[]>);
     method public static byte[] copyOfRange(byte[], int, int);
     method public static short[] copyOfRange(short[], int, int);
     method public static int[] copyOfRange(int[], int, int);
@@ -58684,15 +58684,15 @@
     method public static int hashCode(float[]);
     method public static int hashCode(double[]);
     method public static int hashCode(java.lang.Object[]);
-    method public static void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
-    method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(T[], java.util.function.BinaryOperator<T>);
+    method public static <T> void parallelPrefix(T[], int, int, java.util.function.BinaryOperator<T>);
     method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator);
     method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator);
     method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator);
     method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator);
     method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator);
     method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator);
-    method public static void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
+    method public static <T> void parallelSetAll(T[], java.util.function.IntFunction<? extends T>);
     method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator);
     method public static void parallelSetAll(long[], java.util.function.IntToLongFunction);
     method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction);
@@ -58710,11 +58710,11 @@
     method public static void parallelSort(float[], int, int);
     method public static void parallelSort(double[]);
     method public static void parallelSort(double[], int, int);
-    method public static void parallelSort(T[]);
-    method public static void parallelSort(T[], int, int);
-    method public static void parallelSort(T[], java.util.Comparator<? super T>);
-    method public static void parallelSort(T[], int, int, java.util.Comparator<? super T>);
-    method public static void setAll(T[], java.util.function.IntFunction<? extends T>);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]);
+    method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int);
+    method public static <T> void parallelSort(T[], java.util.Comparator<? super T>);
+    method public static <T> void parallelSort(T[], int, int, java.util.Comparator<? super T>);
+    method public static <T> void setAll(T[], java.util.function.IntFunction<? extends T>);
     method public static void setAll(int[], java.util.function.IntUnaryOperator);
     method public static void setAll(long[], java.util.function.IntToLongFunction);
     method public static void setAll(double[], java.util.function.IntToDoubleFunction);
@@ -58734,18 +58734,18 @@
     method public static void sort(double[], int, int);
     method public static void sort(java.lang.Object[]);
     method public static void sort(java.lang.Object[], int, int);
-    method public static void sort(T[], java.util.Comparator<? super T>);
-    method public static void sort(T[], int, int, java.util.Comparator<? super T>);
-    method public static java.util.Spliterator<T> spliterator(T[]);
-    method public static java.util.Spliterator<T> spliterator(T[], int, int);
+    method public static <T> void sort(T[], java.util.Comparator<? super T>);
+    method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>);
+    method public static <T> java.util.Spliterator<T> spliterator(T[]);
+    method public static <T> java.util.Spliterator<T> spliterator(T[], int, int);
     method public static java.util.Spliterator.OfInt spliterator(int[]);
     method public static java.util.Spliterator.OfInt spliterator(int[], int, int);
     method public static java.util.Spliterator.OfLong spliterator(long[]);
     method public static java.util.Spliterator.OfLong spliterator(long[], int, int);
     method public static java.util.Spliterator.OfDouble spliterator(double[]);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int, int);
-    method public static java.util.stream.Stream<T> stream(T[]);
-    method public static java.util.stream.Stream<T> stream(T[], int, int);
+    method public static <T> java.util.stream.Stream<T> stream(T[]);
+    method public static <T> java.util.stream.Stream<T> stream(T[], int, int);
     method public static java.util.stream.IntStream stream(int[]);
     method public static java.util.stream.IntStream stream(int[], int, int);
     method public static java.util.stream.LongStream stream(long[]);
@@ -58929,7 +58929,7 @@
     field protected long time;
   }
 
-  public abstract interface Collection implements java.lang.Iterable {
+  public abstract interface Collection<E> implements java.lang.Iterable {
     method public abstract boolean add(E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
     method public abstract void clear();
@@ -58947,86 +58947,86 @@
     method public abstract int size();
     method public default java.util.stream.Stream<E> stream();
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
   public class Collections {
-    method public static boolean addAll(java.util.Collection<? super T>, T...);
-    method public static java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
-    method public static int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
-    method public static int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
-    method public static java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
-    method public static java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
-    method public static java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
-    method public static java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
-    method public static java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
-    method public static java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
-    method public static void copy(java.util.List<? super T>, java.util.List<? extends T>);
+    method public static <T> boolean addAll(java.util.Collection<? super T>, T...);
+    method public static <T> java.util.Queue<T> asLifoQueue(java.util.Deque<T>);
+    method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
+    method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
+    method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, java.lang.Class<E>);
+    method public static <E> java.util.List<E> checkedList(java.util.List<E>, java.lang.Class<E>);
+    method public static <K, V> java.util.Map<K, V> checkedMap(java.util.Map<K, V>, java.lang.Class<K>, java.lang.Class<V>);
+    method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, java.lang.Class<E>);
+    method public static <K, V> java.util.SortedMap<K, V> checkedSortedMap(java.util.SortedMap<K, V>, java.lang.Class<K>, java.lang.Class<V>);
+    method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, java.lang.Class<E>);
+    method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>);
     method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>);
-    method public static java.util.Enumeration<T> emptyEnumeration();
-    method public static java.util.Iterator<T> emptyIterator();
-    method public static final java.util.List<T> emptyList();
-    method public static java.util.ListIterator<T> emptyListIterator();
-    method public static final java.util.Map<K, V> emptyMap();
-    method public static final java.util.Set<T> emptySet();
-    method public static java.util.Enumeration<T> enumeration(java.util.Collection<T>);
-    method public static void fill(java.util.List<? super T>, T);
+    method public static <T> java.util.Enumeration<T> emptyEnumeration();
+    method public static <T> java.util.Iterator<T> emptyIterator();
+    method public static final <T> java.util.List<T> emptyList();
+    method public static <T> java.util.ListIterator<T> emptyListIterator();
+    method public static final <K, V> java.util.Map<K, V> emptyMap();
+    method public static final <T> java.util.Set<T> emptySet();
+    method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>);
+    method public static <T> void fill(java.util.List<? super T>, T);
     method public static int frequency(java.util.Collection<?>, java.lang.Object);
     method public static int indexOfSubList(java.util.List<?>, java.util.List<?>);
     method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>);
-    method public static java.util.ArrayList<T> list(java.util.Enumeration<T>);
-    method public static T max(java.util.Collection<? extends T>);
-    method public static T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
-    method public static T min(java.util.Collection<? extends T>);
-    method public static T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
-    method public static java.util.List<T> nCopies(int, T);
-    method public static java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
-    method public static boolean replaceAll(java.util.List<T>, T, T);
+    method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>);
+    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>);
+    method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
+    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>);
+    method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
+    method public static <T> java.util.List<T> nCopies(int, T);
+    method public static <E> java.util.Set<E> newSetFromMap(java.util.Map<E, java.lang.Boolean>);
+    method public static <T> boolean replaceAll(java.util.List<T>, T, T);
     method public static void reverse(java.util.List<?>);
-    method public static java.util.Comparator<T> reverseOrder();
-    method public static java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
+    method public static <T> java.util.Comparator<T> reverseOrder();
+    method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
     method public static void rotate(java.util.List<?>, int);
     method public static void shuffle(java.util.List<?>);
     method public static void shuffle(java.util.List<?>, java.util.Random);
-    method public static java.util.Set<E> singleton(E);
-    method public static java.util.List<E> singletonList(E);
-    method public static java.util.Map<K, V> singletonMap(K, V);
-    method public static void sort(java.util.List<T>);
-    method public static void sort(java.util.List<T>, java.util.Comparator<? super T>);
+    method public static <E> java.util.Set<E> singleton(E);
+    method public static <E> java.util.List<E> singletonList(E);
+    method public static <K, V> java.util.Map<K, V> singletonMap(K, V);
+    method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>);
+    method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>);
     method public static void swap(java.util.List<?>, int, int);
-    method public static java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
-    method public static java.util.List<T> synchronizedList(java.util.List<T>);
-    method public static java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
-    method public static java.util.Set<T> synchronizedSet(java.util.Set<T>);
-    method public static java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
-    method public static java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
-    method public static java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
-    method public static java.util.List<T> unmodifiableList(java.util.List<? extends T>);
-    method public static java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
-    method public static java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
-    method public static java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
-    method public static java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
+    method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
+    method public static <T> java.util.List<T> synchronizedList(java.util.List<T>);
+    method public static <K, V> java.util.Map<K, V> synchronizedMap(java.util.Map<K, V>);
+    method public static <T> java.util.Set<T> synchronizedSet(java.util.Set<T>);
+    method public static <K, V> java.util.SortedMap<K, V> synchronizedSortedMap(java.util.SortedMap<K, V>);
+    method public static <T> java.util.SortedSet<T> synchronizedSortedSet(java.util.SortedSet<T>);
+    method public static <T> java.util.Collection<T> unmodifiableCollection(java.util.Collection<? extends T>);
+    method public static <T> java.util.List<T> unmodifiableList(java.util.List<? extends T>);
+    method public static <K, V> java.util.Map<K, V> unmodifiableMap(java.util.Map<? extends K, ? extends V>);
+    method public static <T> java.util.Set<T> unmodifiableSet(java.util.Set<? extends T>);
+    method public static <K, V> java.util.SortedMap<K, V> unmodifiableSortedMap(java.util.SortedMap<K, ? extends V>);
+    method public static <T> java.util.SortedSet<T> unmodifiableSortedSet(java.util.SortedSet<T>);
     field public static final java.util.List EMPTY_LIST;
     field public static final java.util.Map EMPTY_MAP;
     field public static final java.util.Set EMPTY_SET;
   }
 
-  public abstract interface Comparator {
+  public abstract interface Comparator<T> {
     method public abstract int compare(T, T);
-    method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
-    method public static java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, U> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
+    method public static <T, U extends java.lang.Comparable<? super U>> java.util.Comparator<T> comparing(java.util.function.Function<? super T, ? extends U>);
+    method public static <T> java.util.Comparator<T> comparingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.Comparator<T> comparingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.Comparator<T> comparingLong(java.util.function.ToLongFunction<? super T>);
     method public abstract boolean equals(java.lang.Object);
-    method public static java.util.Comparator<T> naturalOrder();
-    method public static java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
-    method public static java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
-    method public static java.util.Comparator<T> reverseOrder();
+    method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> naturalOrder();
+    method public static <T> java.util.Comparator<T> nullsFirst(java.util.Comparator<? super T>);
+    method public static <T> java.util.Comparator<T> nullsLast(java.util.Comparator<? super T>);
+    method public static <T extends java.lang.Comparable<? super T>> java.util.Comparator<T> reverseOrder();
     method public default java.util.Comparator<T> reversed();
     method public default java.util.Comparator<T> thenComparing(java.util.Comparator<? super T>);
-    method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
-    method public default java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
+    method public default <U> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>, java.util.Comparator<? super U>);
+    method public default <U extends java.lang.Comparable<? super U>> java.util.Comparator<T> thenComparing(java.util.function.Function<? super T, ? extends U>);
     method public default java.util.Comparator<T> thenComparingDouble(java.util.function.ToDoubleFunction<? super T>);
     method public default java.util.Comparator<T> thenComparingInt(java.util.function.ToIntFunction<? super T>);
     method public default java.util.Comparator<T> thenComparingLong(java.util.function.ToLongFunction<? super T>);
@@ -59085,7 +59085,7 @@
     method public deprecated java.lang.String toLocaleString();
   }
 
-  public abstract interface Deque implements java.util.Queue {
+  public abstract interface Deque<E> implements java.util.Queue {
     method public abstract boolean add(E);
     method public abstract void addFirst(E);
     method public abstract void addLast(E);
@@ -59115,7 +59115,7 @@
     method public abstract int size();
   }
 
-  public abstract class Dictionary {
+  public abstract class Dictionary<K, V> {
     ctor public Dictionary();
     method public abstract java.util.Enumeration<V> elements();
     method public abstract V get(java.lang.Object);
@@ -59146,7 +59146,7 @@
     ctor public EmptyStackException();
   }
 
-  public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
+  public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
     ctor public EnumMap(java.lang.Class<K>);
     ctor public EnumMap(java.util.EnumMap<K, ? extends V>);
     ctor public EnumMap(java.util.Map<K, ? extends V>);
@@ -59154,23 +59154,23 @@
     method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
   }
 
-  public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
-    method public static java.util.EnumSet<E> allOf(java.lang.Class<E>);
+  public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable {
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(java.lang.Class<E>);
     method public java.util.EnumSet<E> clone();
-    method public static java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
-    method public static java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
-    method public static java.util.EnumSet<E> copyOf(java.util.Collection<E>);
-    method public static java.util.EnumSet<E> noneOf(java.lang.Class<E>);
-    method public static java.util.EnumSet<E> of(E);
-    method public static java.util.EnumSet<E> of(E, E);
-    method public static java.util.EnumSet<E> of(E, E, E);
-    method public static java.util.EnumSet<E> of(E, E, E, E);
-    method public static java.util.EnumSet<E> of(E, E, E, E, E);
-    method public static java.util.EnumSet<E> of(E, E...);
-    method public static java.util.EnumSet<E> range(E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(java.lang.Class<E>);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...);
+    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E);
   }
 
-  public abstract interface Enumeration {
+  public abstract interface Enumeration<E> {
     method public abstract boolean hasMoreElements();
     method public abstract E nextElement();
   }
@@ -59178,7 +59178,7 @@
   public abstract interface EventListener {
   }
 
-  public abstract class EventListenerProxy implements java.util.EventListener {
+  public abstract class EventListenerProxy<T extends java.util.EventListener> implements java.util.EventListener {
     ctor public EventListenerProxy(T);
     method public T getListener();
   }
@@ -59264,7 +59264,7 @@
     field public static final int BC = 0; // 0x0
   }
 
-  public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class HashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public HashMap(int, float);
     ctor public HashMap(int);
     ctor public HashMap();
@@ -59284,7 +59284,7 @@
     method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
   }
 
-  public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+  public class HashSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
     ctor public HashSet();
     ctor public HashSet(java.util.Collection<? extends E>);
     ctor public HashSet(int, float);
@@ -59295,7 +59295,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class Hashtable<K, V> extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public Hashtable(int, float);
     ctor public Hashtable(int);
     ctor public Hashtable();
@@ -59330,7 +59330,7 @@
     method public java.util.Collection<V> values();
   }
 
-  public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
+  public class IdentityHashMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable {
     ctor public IdentityHashMap();
     ctor public IdentityHashMap(int);
     ctor public IdentityHashMap(java.util.Map<? extends K, ? extends V>);
@@ -59397,14 +59397,14 @@
     ctor public InvalidPropertiesFormatException(java.lang.String);
   }
 
-  public abstract interface Iterator {
+  public abstract interface Iterator<E> {
     method public default void forEachRemaining(java.util.function.Consumer<? super E>);
     method public abstract boolean hasNext();
     method public abstract E next();
     method public default void remove();
   }
 
-  public class LinkedHashMap extends java.util.HashMap implements java.util.Map {
+  public class LinkedHashMap<K, V> extends java.util.HashMap implements java.util.Map {
     ctor public LinkedHashMap(int, float);
     ctor public LinkedHashMap(int);
     ctor public LinkedHashMap();
@@ -59413,14 +59413,14 @@
     method protected boolean removeEldestEntry(java.util.Map.Entry<K, V>);
   }
 
-  public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
+  public class LinkedHashSet<E> extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set {
     ctor public LinkedHashSet(int, float);
     ctor public LinkedHashSet(int);
     ctor public LinkedHashSet();
     ctor public LinkedHashSet(java.util.Collection<? extends E>);
   }
 
-  public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
+  public class LinkedList<E> extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable {
     ctor public LinkedList();
     ctor public LinkedList(java.util.Collection<? extends E>);
     method public void addFirst(E);
@@ -59451,7 +59451,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public abstract interface List implements java.util.Collection {
+  public abstract interface List<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract void add(int, E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
@@ -59478,10 +59478,10 @@
     method public default void sort(java.util.Comparator<? super E>);
     method public abstract java.util.List<E> subList(int, int);
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
-  public abstract interface ListIterator implements java.util.Iterator {
+  public abstract interface ListIterator<E> implements java.util.Iterator {
     method public abstract void add(E);
     method public abstract boolean hasNext();
     method public abstract boolean hasPrevious();
@@ -59598,7 +59598,7 @@
     method public final long getSum();
   }
 
-  public abstract interface Map {
+  public abstract interface Map<K, V> {
     method public abstract void clear();
     method public default V compute(K, java.util.function.BiFunction<? super K, ? super V, ? extends V>);
     method public default V computeIfAbsent(K, java.util.function.Function<? super K, ? extends V>);
@@ -59626,11 +59626,11 @@
     method public abstract java.util.Collection<V> values();
   }
 
-  public static abstract interface Map.Entry {
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
-    method public static java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
+  public static abstract interface Map.Entry<K, V> {
+    method public static <K extends java.lang.Comparable<? super K>, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey();
+    method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByKey(java.util.Comparator<? super K>);
+    method public static <K, V extends java.lang.Comparable<? super V>> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue();
+    method public static <K, V> java.util.Comparator<java.util.Map.Entry<K, V>> comparingByValue(java.util.Comparator<? super V>);
     method public abstract boolean equals(java.lang.Object);
     method public abstract K getKey();
     method public abstract V getValue();
@@ -59654,7 +59654,7 @@
     method public java.lang.String getKey();
   }
 
-  public abstract interface NavigableMap implements java.util.SortedMap {
+  public abstract interface NavigableMap<K, V> implements java.util.SortedMap {
     method public abstract java.util.Map.Entry<K, V> ceilingEntry(K);
     method public abstract K ceilingKey(K);
     method public abstract java.util.NavigableSet<K> descendingKeySet();
@@ -59678,7 +59678,7 @@
     method public abstract java.util.SortedMap<K, V> tailMap(K);
   }
 
-  public abstract interface NavigableSet implements java.util.SortedSet {
+  public abstract interface NavigableSet<E> implements java.util.SortedSet {
     method public abstract E ceiling(E);
     method public abstract java.util.Iterator<E> descendingIterator();
     method public abstract java.util.NavigableSet<E> descendingSet();
@@ -59702,16 +59702,16 @@
   }
 
   public final class Objects {
-    method public static int compare(T, T, java.util.Comparator<? super T>);
+    method public static <T> int compare(T, T, java.util.Comparator<? super T>);
     method public static boolean deepEquals(java.lang.Object, java.lang.Object);
     method public static boolean equals(java.lang.Object, java.lang.Object);
     method public static int hash(java.lang.Object...);
     method public static int hashCode(java.lang.Object);
     method public static boolean isNull(java.lang.Object);
     method public static boolean nonNull(java.lang.Object);
-    method public static T requireNonNull(T);
-    method public static T requireNonNull(T, java.lang.String);
-    method public static T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
+    method public static <T> T requireNonNull(T);
+    method public static <T> T requireNonNull(T, java.lang.String);
+    method public static <T> T requireNonNull(T, java.util.function.Supplier<java.lang.String>);
     method public static java.lang.String toString(java.lang.Object);
     method public static java.lang.String toString(java.lang.Object, java.lang.String);
   }
@@ -59733,19 +59733,19 @@
     method public abstract void update(java.util.Observable, java.lang.Object);
   }
 
-  public final class Optional {
-    method public static java.util.Optional<T> empty();
+  public final class Optional<T> {
+    method public static <T> java.util.Optional<T> empty();
     method public java.util.Optional<T> filter(java.util.function.Predicate<? super T>);
-    method public java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
+    method public <U> java.util.Optional<U> flatMap(java.util.function.Function<? super T, java.util.Optional<U>>);
     method public T get();
     method public void ifPresent(java.util.function.Consumer<? super T>);
     method public boolean isPresent();
-    method public java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.Optional<T> of(T);
-    method public static java.util.Optional<T> ofNullable(T);
+    method public <U> java.util.Optional<U> map(java.util.function.Function<? super T, ? extends U>);
+    method public static <T> java.util.Optional<T> of(T);
+    method public static <T> java.util.Optional<T> ofNullable(T);
     method public T orElse(T);
     method public T orElseGet(java.util.function.Supplier<? extends T>);
-    method public T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
   }
 
   public final class OptionalDouble {
@@ -59756,7 +59756,7 @@
     method public static java.util.OptionalDouble of(double);
     method public double orElse(double);
     method public double orElseGet(java.util.function.DoubleSupplier);
-    method public double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> double orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
   public final class OptionalInt {
@@ -59767,7 +59767,7 @@
     method public static java.util.OptionalInt of(int);
     method public int orElse(int);
     method public int orElseGet(java.util.function.IntSupplier);
-    method public int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> int orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
   public final class OptionalLong {
@@ -59778,10 +59778,10 @@
     method public static java.util.OptionalLong of(long);
     method public long orElse(long);
     method public long orElseGet(java.util.function.LongSupplier);
-    method public long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
+    method public <X extends java.lang.Throwable> long orElseThrow(java.util.function.Supplier<X>) throws java.lang.Throwable;
   }
 
-  public abstract interface PrimitiveIterator implements java.util.Iterator {
+  public abstract interface PrimitiveIterator<T, T_CONS> implements java.util.Iterator {
     method public abstract void forEachRemaining(T_CONS);
   }
 
@@ -59806,7 +59806,7 @@
     method public abstract long nextLong();
   }
 
-  public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable {
+  public class PriorityQueue<E> extends java.util.AbstractQueue implements java.io.Serializable {
     ctor public PriorityQueue();
     ctor public PriorityQueue(int);
     ctor public PriorityQueue(java.util.Comparator<? super E>);
@@ -59855,7 +59855,7 @@
     method public java.lang.Object handleGetObject(java.lang.String);
   }
 
-  public abstract interface Queue implements java.util.Collection {
+  public abstract interface Queue<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract E element();
     method public abstract boolean offer(E);
@@ -60007,15 +60007,15 @@
     ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable);
   }
 
-  public final class ServiceLoader implements java.lang.Iterable {
+  public final class ServiceLoader<S> implements java.lang.Iterable {
     method public java.util.Iterator<S> iterator();
-    method public static java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
-    method public static java.util.ServiceLoader<S> load(java.lang.Class<S>);
-    method public static java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
+    method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>, java.lang.ClassLoader);
+    method public static <S> java.util.ServiceLoader<S> load(java.lang.Class<S>);
+    method public static <S> java.util.ServiceLoader<S> loadInstalled(java.lang.Class<S>);
     method public void reload();
   }
 
-  public abstract interface Set implements java.util.Collection {
+  public abstract interface Set<E> implements java.util.Collection {
     method public abstract boolean add(E);
     method public abstract boolean addAll(java.util.Collection<? extends E>);
     method public abstract void clear();
@@ -60030,7 +60030,7 @@
     method public abstract boolean retainAll(java.util.Collection<?>);
     method public abstract int size();
     method public abstract java.lang.Object[] toArray();
-    method public abstract T[] toArray(T[]);
+    method public abstract <T> T[] toArray(T[]);
   }
 
   public class SimpleTimeZone extends java.util.TimeZone {
@@ -60056,7 +60056,7 @@
     field public static final int WALL_TIME = 0; // 0x0
   }
 
-  public abstract interface SortedMap implements java.util.Map {
+  public abstract interface SortedMap<K, V> implements java.util.Map {
     method public abstract java.util.Comparator<? super K> comparator();
     method public abstract java.util.Set<java.util.Map.Entry<K, V>> entrySet();
     method public abstract K firstKey();
@@ -60068,7 +60068,7 @@
     method public abstract java.util.Collection<V> values();
   }
 
-  public abstract interface SortedSet implements java.util.Set {
+  public abstract interface SortedSet<E> implements java.util.Set {
     method public abstract java.util.Comparator<? super E> comparator();
     method public abstract E first();
     method public abstract java.util.SortedSet<E> headSet(E);
@@ -60077,7 +60077,7 @@
     method public abstract java.util.SortedSet<E> tailSet(E);
   }
 
-  public abstract interface Spliterator {
+  public abstract interface Spliterator<T> {
     method public abstract int characteristics();
     method public abstract long estimateSize();
     method public default void forEachRemaining(java.util.function.Consumer<? super T>);
@@ -60120,7 +60120,7 @@
     method public abstract java.util.Spliterator.OfLong trySplit();
   }
 
-  public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator {
+  public static abstract interface Spliterator.OfPrimitive<T, T_CONS, T_SPLITR extends java.util.Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>> implements java.util.Spliterator {
     method public default void forEachRemaining(T_CONS);
     method public abstract boolean tryAdvance(T_CONS);
     method public abstract T_SPLITR trySplit();
@@ -60130,25 +60130,25 @@
     method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator();
     method public static java.util.Spliterator.OfInt emptyIntSpliterator();
     method public static java.util.Spliterator.OfLong emptyLongSpliterator();
-    method public static java.util.Spliterator<T> emptySpliterator();
-    method public static java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>);
+    method public static <T> java.util.Spliterator<T> emptySpliterator();
+    method public static <T> java.util.Iterator<T> iterator(java.util.Spliterator<? extends T>);
     method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt);
     method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong);
     method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble);
-    method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int);
-    method public static java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.lang.Object[], int, int, int);
     method public static java.util.Spliterator.OfInt spliterator(int[], int);
     method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int);
     method public static java.util.Spliterator.OfLong spliterator(long[], int);
     method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int);
     method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int);
-    method public static java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int);
-    method public static java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.util.Collection<? extends T>, int);
+    method public static <T> java.util.Spliterator<T> spliterator(java.util.Iterator<? extends T>, long, int);
     method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int);
     method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int);
     method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int);
-    method public static java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int);
+    method public static <T> java.util.Spliterator<T> spliteratorUnknownSize(java.util.Iterator<? extends T>, int);
     method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int);
     method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int);
     method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int);
@@ -60175,7 +60175,7 @@
     method public java.util.Spliterator.OfLong trySplit();
   }
 
-  public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator {
+  public static abstract class Spliterators.AbstractSpliterator<T> implements java.util.Spliterator {
     ctor protected Spliterators.AbstractSpliterator(long, int);
     method public int characteristics();
     method public long estimateSize();
@@ -60210,7 +60210,7 @@
     method public java.util.SplittableRandom split();
   }
 
-  public class Stack extends java.util.Vector {
+  public class Stack<E> extends java.util.Vector {
     ctor public Stack();
     method public boolean empty();
     method public synchronized E peek();
@@ -60294,7 +60294,7 @@
     ctor public TooManyListenersException(java.lang.String);
   }
 
-  public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
+  public class TreeMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable {
     ctor public TreeMap();
     ctor public TreeMap(java.util.Comparator<? super K>);
     ctor public TreeMap(java.util.Map<? extends K, ? extends V>);
@@ -60331,7 +60331,7 @@
     method public java.util.SortedMap<K, V> tailMap(K);
   }
 
-  public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+  public class TreeSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
     ctor public TreeSet();
     ctor public TreeSet(java.util.Comparator<? super E>);
     ctor public TreeSet(java.util.Collection<? extends E>);
@@ -60384,7 +60384,7 @@
     method public java.lang.String getFlags();
   }
 
-  public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class Vector<E> extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public Vector(int, int);
     ctor public Vector(int);
     ctor public Vector();
@@ -60419,7 +60419,7 @@
     field protected java.lang.Object[] elementData;
   }
 
-  public class WeakHashMap extends java.util.AbstractMap implements java.util.Map {
+  public class WeakHashMap<K, V> extends java.util.AbstractMap implements java.util.Map {
     ctor public WeakHashMap(int, float);
     ctor public WeakHashMap(int);
     ctor public WeakHashMap();
@@ -60435,18 +60435,18 @@
 
   public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService {
     ctor public AbstractExecutorService();
-    method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
-    method public java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method public T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
-    method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
-    method protected java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
+    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+    method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.lang.Runnable, T);
+    method protected <T> java.util.concurrent.RunnableFuture<T> newTaskFor(java.util.concurrent.Callable<T>);
     method public java.util.concurrent.Future<?> submit(java.lang.Runnable);
-    method public java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
-    method public java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+    method public <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+    method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
   }
 
-  public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class ArrayBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public ArrayBlockingQueue(int);
     ctor public ArrayBlockingQueue(int, boolean);
     ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>);
@@ -60465,7 +60465,7 @@
     method public E take() throws java.lang.InterruptedException;
   }
 
-  public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque {
+  public abstract interface BlockingDeque<E> implements java.util.concurrent.BlockingQueue java.util.Deque {
     method public abstract boolean add(E);
     method public abstract void addFirst(E);
     method public abstract void addLast(E);
@@ -60497,7 +60497,7 @@
     method public abstract E takeLast() throws java.lang.InterruptedException;
   }
 
-  public abstract interface BlockingQueue implements java.util.Queue {
+  public abstract interface BlockingQueue<E> implements java.util.Queue {
     method public abstract boolean add(E);
     method public abstract boolean contains(java.lang.Object);
     method public abstract int drainTo(java.util.Collection<? super E>);
@@ -60516,7 +60516,7 @@
     ctor public BrokenBarrierException(java.lang.String);
   }
 
-  public abstract interface Callable {
+  public abstract interface Callable<V> {
     method public abstract V call() throws java.lang.Exception;
   }
 
@@ -60525,28 +60525,28 @@
     ctor public CancellationException(java.lang.String);
   }
 
-  public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
+  public class CompletableFuture<T> implements java.util.concurrent.CompletionStage java.util.concurrent.Future {
     ctor public CompletableFuture();
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> allOf(java.util.concurrent.CompletableFuture<?>...);
     method public static java.util.concurrent.CompletableFuture<java.lang.Object> anyOf(java.util.concurrent.CompletableFuture<?>...);
-    method public java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
     method public boolean cancel(boolean);
     method public boolean complete(T);
     method public boolean completeExceptionally(java.lang.Throwable);
-    method public static java.util.concurrent.CompletableFuture<U> completedFuture(U);
+    method public static <U> java.util.concurrent.CompletableFuture<U> completedFuture(U);
     method public java.util.concurrent.CompletableFuture<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
     method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
     method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
     method public T getNow(T);
     method public int getNumberOfDependents();
-    method public java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
     method public boolean isCancelled();
     method public boolean isCompletedExceptionally();
     method public boolean isDone();
@@ -60561,23 +60561,23 @@
     method public java.util.concurrent.CompletableFuture<java.lang.Void> runAfterEitherAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable);
     method public static java.util.concurrent.CompletableFuture<java.lang.Void> runAsync(java.lang.Runnable, java.util.concurrent.Executor);
-    method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
-    method public static java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
+    method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>);
+    method public static <U> java.util.concurrent.CompletableFuture<U> supplyAsync(java.util.function.Supplier<U>, java.util.concurrent.Executor);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
-    method public java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
-    method public java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public <U> java.util.concurrent.CompletableFuture<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApply(java.util.function.Function<? super T, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public <U, V> java.util.concurrent.CompletableFuture<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public <U> java.util.concurrent.CompletableFuture<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRun(java.lang.Runnable);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable);
     method public java.util.concurrent.CompletableFuture<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
@@ -60597,7 +60597,7 @@
     ctor public CompletionException(java.lang.Throwable);
   }
 
-  public abstract interface CompletionService {
+  public abstract interface CompletionService<V> {
     method public abstract java.util.concurrent.Future<V> poll();
     method public abstract java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
     method public abstract java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
@@ -60605,17 +60605,17 @@
     method public abstract java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
   }
 
-  public abstract interface CompletionStage {
+  public abstract interface CompletionStage<T> {
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> acceptEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
-    method public abstract java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEither(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> applyToEitherAsync(java.util.concurrent.CompletionStage<? extends T>, java.util.function.Function<? super T, U>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<T> exceptionally(java.util.function.Function<java.lang.Throwable, ? extends T>);
-    method public abstract java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handle(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> handleAsync(java.util.function.BiFunction<? super T, java.lang.Throwable, ? extends U>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBoth(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> runAfterBothAsync(java.util.concurrent.CompletionStage<?>, java.lang.Runnable, java.util.concurrent.Executor);
@@ -60625,18 +60625,18 @@
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAccept(java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptAsync(java.util.function.Consumer<? super T>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
-    method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
-    method public abstract java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
-    method public abstract java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
-    method public abstract java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBoth(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<java.lang.Void> thenAcceptBothAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiConsumer<? super T, ? super U>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApply(java.util.function.Function<? super T, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenApplyAsync(java.util.function.Function<? super T, ? extends U>, java.util.concurrent.Executor);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombine(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>);
+    method public abstract <U, V> java.util.concurrent.CompletionStage<V> thenCombineAsync(java.util.concurrent.CompletionStage<? extends U>, java.util.function.BiFunction<? super T, ? super U, ? extends V>, java.util.concurrent.Executor);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenCompose(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>);
+    method public abstract <U> java.util.concurrent.CompletionStage<U> thenComposeAsync(java.util.function.Function<? super T, ? extends java.util.concurrent.CompletionStage<U>>, java.util.concurrent.Executor);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRun(java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable);
     method public abstract java.util.concurrent.CompletionStage<java.lang.Void> thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor);
@@ -60646,7 +60646,7 @@
     method public abstract java.util.concurrent.CompletionStage<T> whenCompleteAsync(java.util.function.BiConsumer<? super T, ? super java.lang.Throwable>, java.util.concurrent.Executor);
   }
 
-  public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
+  public class ConcurrentHashMap<K, V> extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable {
     ctor public ConcurrentHashMap();
     ctor public ConcurrentHashMap(int);
     ctor public ConcurrentHashMap(java.util.Map<? extends K, ? extends V>);
@@ -60660,29 +60660,29 @@
     method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
     method public void forEach(java.util.function.BiConsumer<? super K, ? super V>);
     method public void forEach(long, java.util.function.BiConsumer<? super K, ? super V>);
-    method public void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEach(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachEntry(long, java.util.function.Consumer<? super java.util.Map.Entry<K, V>>);
-    method public void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachEntry(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachKey(long, java.util.function.Consumer<? super K>);
-    method public void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachKey(long, java.util.function.Function<? super K, ? extends U>, java.util.function.Consumer<? super U>);
     method public void forEachValue(long, java.util.function.Consumer<? super V>);
-    method public void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
+    method public <U> void forEachValue(long, java.util.function.Function<? super V, ? extends U>, java.util.function.Consumer<? super U>);
     method public V getOrDefault(java.lang.Object, V);
     method public java.util.concurrent.ConcurrentHashMap.KeySetView<K, V> keySet(V);
     method public java.util.Enumeration<K> keys();
     method public long mappingCount();
     method public V merge(K, V, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
-    method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
-    method public static java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
+    method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet();
+    method public static <K> java.util.concurrent.ConcurrentHashMap.KeySetView<K, java.lang.Boolean> newKeySet(int);
     method public V putIfAbsent(K, V);
-    method public U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduce(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public java.util.Map.Entry<K, V> reduceEntries(long, java.util.function.BiFunction<java.util.Map.Entry<K, V>, java.util.Map.Entry<K, V>, ? extends java.util.Map.Entry<K, V>>);
-    method public U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction<java.util.Map.Entry<K, V>>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceEntriesToInt(long, java.util.function.ToIntFunction<java.util.Map.Entry<K, V>>, int, java.util.function.IntBinaryOperator);
     method public long reduceEntriesToLong(long, java.util.function.ToLongFunction<java.util.Map.Entry<K, V>>, long, java.util.function.LongBinaryOperator);
     method public K reduceKeys(long, java.util.function.BiFunction<? super K, ? super K, ? extends K>);
-    method public U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceKeys(long, java.util.function.Function<? super K, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction<? super K>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceKeysToInt(long, java.util.function.ToIntFunction<? super K>, int, java.util.function.IntBinaryOperator);
     method public long reduceKeysToLong(long, java.util.function.ToLongFunction<? super K>, long, java.util.function.LongBinaryOperator);
@@ -60690,7 +60690,7 @@
     method public int reduceToInt(long, java.util.function.ToIntBiFunction<? super K, ? super V>, int, java.util.function.IntBinaryOperator);
     method public long reduceToLong(long, java.util.function.ToLongBiFunction<? super K, ? super V>, long, java.util.function.LongBinaryOperator);
     method public V reduceValues(long, java.util.function.BiFunction<? super V, ? super V, ? extends V>);
-    method public U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
+    method public <U> U reduceValues(long, java.util.function.Function<? super V, ? extends U>, java.util.function.BiFunction<? super U, ? super U, ? extends U>);
     method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction<? super V>, double, java.util.function.DoubleBinaryOperator);
     method public int reduceValuesToInt(long, java.util.function.ToIntFunction<? super V>, int, java.util.function.IntBinaryOperator);
     method public long reduceValuesToLong(long, java.util.function.ToLongFunction<? super V>, long, java.util.function.LongBinaryOperator);
@@ -60698,13 +60698,13 @@
     method public boolean replace(K, V, V);
     method public V replace(K, V);
     method public void replaceAll(java.util.function.BiFunction<? super K, ? super V, ? extends V>);
-    method public U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
-    method public U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
-    method public U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
-    method public U searchValues(long, java.util.function.Function<? super V, ? extends U>);
+    method public <U> U search(long, java.util.function.BiFunction<? super K, ? super V, ? extends U>);
+    method public <U> U searchEntries(long, java.util.function.Function<java.util.Map.Entry<K, V>, ? extends U>);
+    method public <U> U searchKeys(long, java.util.function.Function<? super K, ? extends U>);
+    method public <U> U searchValues(long, java.util.function.Function<? super V, ? extends U>);
   }
 
-   static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable {
+   static abstract class ConcurrentHashMap.CollectionView<K, V, E> implements java.util.Collection java.io.Serializable {
     method public final void clear();
     method public abstract boolean contains(java.lang.Object);
     method public final boolean containsAll(java.util.Collection<?>);
@@ -60716,11 +60716,11 @@
     method public final boolean retainAll(java.util.Collection<?>);
     method public final int size();
     method public final java.lang.Object[] toArray();
-    method public final T[] toArray(T[]);
+    method public final <T> T[] toArray(T[]);
     method public final java.lang.String toString();
   }
 
-  public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set {
+  public static class ConcurrentHashMap.KeySetView<K, V> extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set {
     method public boolean add(K);
     method public boolean addAll(java.util.Collection<? extends K>);
     method public boolean contains(java.lang.Object);
@@ -60731,7 +60731,7 @@
     method public java.util.Spliterator<K> spliterator();
   }
 
-  public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
+  public class ConcurrentLinkedDeque<E> extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable {
     ctor public ConcurrentLinkedDeque();
     ctor public ConcurrentLinkedDeque(java.util.Collection<? extends E>);
     method public void addFirst(E);
@@ -60761,7 +60761,7 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
+  public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable {
     ctor public ConcurrentLinkedQueue();
     ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>);
     method public java.util.Iterator<E> iterator();
@@ -60772,14 +60772,14 @@
     method public java.util.Spliterator<E> spliterator();
   }
 
-  public abstract interface ConcurrentMap implements java.util.Map {
+  public abstract interface ConcurrentMap<K, V> implements java.util.Map {
     method public abstract V putIfAbsent(K, V);
     method public abstract boolean remove(java.lang.Object, java.lang.Object);
     method public abstract boolean replace(K, V, V);
     method public abstract V replace(K, V);
   }
 
-  public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
+  public abstract interface ConcurrentNavigableMap<K, V> implements java.util.concurrent.ConcurrentMap java.util.NavigableMap {
     method public abstract java.util.NavigableSet<K> descendingKeySet();
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> descendingMap();
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> headMap(K, boolean);
@@ -60792,7 +60792,7 @@
     method public abstract java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
   }
 
-  public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
+  public class ConcurrentSkipListMap<K, V> extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable {
     ctor public ConcurrentSkipListMap();
     ctor public ConcurrentSkipListMap(java.util.Comparator<? super K>);
     ctor public ConcurrentSkipListMap(java.util.Map<? extends K, ? extends V>);
@@ -60836,7 +60836,7 @@
     method public java.util.concurrent.ConcurrentNavigableMap<K, V> tailMap(K);
   }
 
-  public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
+  public class ConcurrentSkipListSet<E> extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable {
     ctor public ConcurrentSkipListSet();
     ctor public ConcurrentSkipListSet(java.util.Comparator<? super E>);
     ctor public ConcurrentSkipListSet(java.util.Collection<? extends E>);
@@ -60864,7 +60864,7 @@
     method public java.util.NavigableSet<E> tailSet(E);
   }
 
-  public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
+  public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable {
     ctor public CopyOnWriteArrayList();
     ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>);
     ctor public CopyOnWriteArrayList(E[]);
@@ -60896,10 +60896,10 @@
     method public int size();
     method public java.util.List<E> subList(int, int);
     method public java.lang.Object[] toArray();
-    method public T[] toArray(T[]);
+    method public <T> T[] toArray(T[]);
   }
 
-  public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable {
+  public class CopyOnWriteArraySet<E> extends java.util.AbstractSet implements java.io.Serializable {
     ctor public CopyOnWriteArraySet();
     ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
     method public void forEach(java.util.function.Consumer<? super E>);
@@ -60917,7 +60917,7 @@
     method public long getCount();
   }
 
-  public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask {
+  public abstract class CountedCompleter<T> extends java.util.concurrent.ForkJoinTask {
     ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>, int);
     ctor protected CountedCompleter(java.util.concurrent.CountedCompleter<?>);
     ctor protected CountedCompleter();
@@ -60954,7 +60954,7 @@
     method public void reset();
   }
 
-  public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
+  public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue {
     ctor public DelayQueue();
     ctor public DelayQueue(java.util.Collection<? extends E>);
     method public int drainTo(java.util.Collection<? super E>);
@@ -60975,7 +60975,7 @@
     method public abstract long getDelay(java.util.concurrent.TimeUnit);
   }
 
-  public class Exchanger {
+  public class Exchanger<V> {
     ctor public Exchanger();
     method public V exchange(V) throws java.lang.InterruptedException;
     method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -60992,7 +60992,7 @@
     method public abstract void execute(java.lang.Runnable);
   }
 
-  public class ExecutorCompletionService implements java.util.concurrent.CompletionService {
+  public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService {
     ctor public ExecutorCompletionService(java.util.concurrent.Executor);
     ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>);
     method public java.util.concurrent.Future<V> poll();
@@ -61004,21 +61004,21 @@
 
   public abstract interface ExecutorService implements java.util.concurrent.Executor {
     method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
-    method public abstract java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
-    method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
-    method public abstract T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
+    method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
+    method public abstract <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
+    method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
+    method public abstract <T> T invokeAny(java.util.Collection<? extends java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
     method public abstract boolean isShutdown();
     method public abstract boolean isTerminated();
     method public abstract void shutdown();
     method public abstract java.util.List<java.lang.Runnable> shutdownNow();
-    method public abstract java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
-    method public abstract java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
+    method public abstract <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
+    method public abstract <T> java.util.concurrent.Future<T> submit(java.lang.Runnable, T);
     method public abstract java.util.concurrent.Future<?> submit(java.lang.Runnable);
   }
 
   public class Executors {
-    method public static java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
+    method public static <T> java.util.concurrent.Callable<T> callable(java.lang.Runnable, T);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.lang.Runnable);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction<?>);
     method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction<?>);
@@ -61035,8 +61035,8 @@
     method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory);
     method public static java.util.concurrent.ExecutorService newWorkStealingPool(int);
     method public static java.util.concurrent.ExecutorService newWorkStealingPool();
-    method public static java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
-    method public static java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
+    method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
+    method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
     method public static java.util.concurrent.ThreadFactory privilegedThreadFactory();
     method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService);
     method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService);
@@ -61064,7 +61064,7 @@
     method public long getStealCount();
     method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
     method public boolean hasQueuedSubmissions();
-    method public T invoke(java.util.concurrent.ForkJoinTask<T>);
+    method public <T> T invoke(java.util.concurrent.ForkJoinTask<T>);
     method public boolean isQuiescent();
     method public boolean isShutdown();
     method public boolean isTerminated();
@@ -61073,7 +61073,7 @@
     method protected java.util.concurrent.ForkJoinTask<?> pollSubmission();
     method public void shutdown();
     method public java.util.List<java.lang.Runnable> shutdownNow();
-    method public java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
+    method public <T> java.util.concurrent.ForkJoinTask<T> submit(java.util.concurrent.ForkJoinTask<T>);
     field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory;
   }
 
@@ -61086,11 +61086,11 @@
     method public abstract boolean isReleasable();
   }
 
-  public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable {
+  public abstract class ForkJoinTask<V> implements java.util.concurrent.Future java.io.Serializable {
     ctor public ForkJoinTask();
     method public static java.util.concurrent.ForkJoinTask<?> adapt(java.lang.Runnable);
-    method public static java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
-    method public static java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
+    method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.lang.Runnable, T);
+    method public static <T> java.util.concurrent.ForkJoinTask<T> adapt(java.util.concurrent.Callable<? extends T>);
     method public boolean cancel(boolean);
     method public final boolean compareAndSetForkJoinTaskTag(short, short);
     method public void complete(V);
@@ -61110,7 +61110,7 @@
     method public final V invoke();
     method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>, java.util.concurrent.ForkJoinTask<?>);
     method public static void invokeAll(java.util.concurrent.ForkJoinTask<?>...);
-    method public static java.util.Collection<T> invokeAll(java.util.Collection<T>);
+    method public static <T extends java.util.concurrent.ForkJoinTask<?>> java.util.Collection<T> invokeAll(java.util.Collection<T>);
     method public final boolean isCancelled();
     method public final boolean isCompletedAbnormally();
     method public final boolean isCompletedNormally();
@@ -61136,7 +61136,7 @@
     method protected void onTermination(java.lang.Throwable);
   }
 
-  public abstract interface Future {
+  public abstract interface Future<V> {
     method public abstract boolean cancel(boolean);
     method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
     method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
@@ -61144,7 +61144,7 @@
     method public abstract boolean isDone();
   }
 
-  public class FutureTask implements java.util.concurrent.RunnableFuture {
+  public class FutureTask<V> implements java.util.concurrent.RunnableFuture {
     ctor public FutureTask(java.util.concurrent.Callable<V>);
     ctor public FutureTask(java.lang.Runnable, V);
     method public boolean cancel(boolean);
@@ -61159,7 +61159,7 @@
     method protected void setException(java.lang.Throwable);
   }
 
-  public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
+  public class LinkedBlockingDeque<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable {
     ctor public LinkedBlockingDeque();
     ctor public LinkedBlockingDeque(int);
     ctor public LinkedBlockingDeque(java.util.Collection<? extends E>);
@@ -61203,7 +61203,7 @@
     method public E takeLast() throws java.lang.InterruptedException;
   }
 
-  public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class LinkedBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public LinkedBlockingQueue();
     ctor public LinkedBlockingQueue(int);
     ctor public LinkedBlockingQueue(java.util.Collection<? extends E>);
@@ -61222,7 +61222,7 @@
     method public E take() throws java.lang.InterruptedException;
   }
 
-  public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
+  public class LinkedTransferQueue<E> extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue {
     ctor public LinkedTransferQueue();
     ctor public LinkedTransferQueue(java.util.Collection<? extends E>);
     method public int drainTo(java.util.Collection<? super E>);
@@ -61269,7 +61269,7 @@
     method public int register();
   }
 
-  public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class PriorityBlockingQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public PriorityBlockingQueue();
     ctor public PriorityBlockingQueue(int);
     ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>);
@@ -61298,7 +61298,7 @@
     method protected final void setRawResult(java.lang.Void);
   }
 
-  public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask {
+  public abstract class RecursiveTask<V> extends java.util.concurrent.ForkJoinTask {
     ctor public RecursiveTask();
     method protected abstract V compute();
     method protected final boolean exec();
@@ -61317,22 +61317,22 @@
     method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor);
   }
 
-  public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable {
+  public abstract interface RunnableFuture<V> implements java.util.concurrent.Future java.lang.Runnable {
     method public abstract void run();
   }
 
-  public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
+  public abstract interface RunnableScheduledFuture<V> implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture {
     method public abstract boolean isPeriodic();
   }
 
   public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService {
     method public abstract java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
-    method public abstract java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+    method public abstract <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
     method public abstract java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public abstract java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
   }
 
-  public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future {
+  public abstract interface ScheduledFuture<V> implements java.util.concurrent.Delayed java.util.concurrent.Future {
   }
 
   public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService {
@@ -61340,13 +61340,13 @@
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory);
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler);
     ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
-    method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
-    method protected java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
+    method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture<V>);
+    method protected <V> java.util.concurrent.RunnableScheduledFuture<V> decorateTask(java.util.concurrent.Callable<V>, java.util.concurrent.RunnableScheduledFuture<V>);
     method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy();
     method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy();
     method public boolean getRemoveOnCancelPolicy();
     method public java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit);
-    method public java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
+    method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
     method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit);
     method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean);
@@ -61376,7 +61376,7 @@
     method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
   }
 
-  public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
+  public class SynchronousQueue<E> extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable {
     ctor public SynchronousQueue();
     ctor public SynchronousQueue(boolean);
     method public int drainTo(java.util.Collection<? super E>);
@@ -61494,7 +61494,7 @@
     ctor public TimeoutException(java.lang.String);
   }
 
-  public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue {
+  public abstract interface TransferQueue<E> implements java.util.concurrent.BlockingQueue {
     method public abstract int getWaitingConsumerCount();
     method public abstract boolean hasWaitingConsumer();
     method public abstract void transfer(E) throws java.lang.InterruptedException;
@@ -61564,7 +61564,7 @@
     method public final boolean weakCompareAndSet(int, int, int);
   }
 
-  public abstract class AtomicIntegerFieldUpdater {
+  public abstract class AtomicIntegerFieldUpdater<T> {
     ctor protected AtomicIntegerFieldUpdater();
     method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator);
     method public int addAndGet(T, int);
@@ -61579,7 +61579,7 @@
     method public final int getAndUpdate(T, java.util.function.IntUnaryOperator);
     method public int incrementAndGet(T);
     method public abstract void lazySet(T, int);
-    method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+    method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
     method public abstract void set(T, int);
     method public final int updateAndGet(T, java.util.function.IntUnaryOperator);
     method public abstract boolean weakCompareAndSet(T, int, int);
@@ -61632,7 +61632,7 @@
     method public final boolean weakCompareAndSet(int, long, long);
   }
 
-  public abstract class AtomicLongFieldUpdater {
+  public abstract class AtomicLongFieldUpdater<T> {
     ctor protected AtomicLongFieldUpdater();
     method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator);
     method public long addAndGet(T, long);
@@ -61647,13 +61647,13 @@
     method public final long getAndUpdate(T, java.util.function.LongUnaryOperator);
     method public long incrementAndGet(T);
     method public abstract void lazySet(T, long);
-    method public static java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
+    method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(java.lang.Class<U>, java.lang.String);
     method public abstract void set(T, long);
     method public final long updateAndGet(T, java.util.function.LongUnaryOperator);
     method public abstract boolean weakCompareAndSet(T, long, long);
   }
 
-  public class AtomicMarkableReference {
+  public class AtomicMarkableReference<V> {
     ctor public AtomicMarkableReference(V, boolean);
     method public boolean attemptMark(V, boolean);
     method public boolean compareAndSet(V, V, boolean, boolean);
@@ -61664,7 +61664,7 @@
     method public boolean weakCompareAndSet(V, V, boolean, boolean);
   }
 
-  public class AtomicReference implements java.io.Serializable {
+  public class AtomicReference<V> implements java.io.Serializable {
     ctor public AtomicReference(V);
     ctor public AtomicReference();
     method public final V accumulateAndGet(V, java.util.function.BinaryOperator<V>);
@@ -61679,7 +61679,7 @@
     method public final boolean weakCompareAndSet(V, V);
   }
 
-  public class AtomicReferenceArray implements java.io.Serializable {
+  public class AtomicReferenceArray<E> implements java.io.Serializable {
     ctor public AtomicReferenceArray(int);
     ctor public AtomicReferenceArray(E[]);
     method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator<E>);
@@ -61695,7 +61695,7 @@
     method public final boolean weakCompareAndSet(int, E, E);
   }
 
-  public abstract class AtomicReferenceFieldUpdater {
+  public abstract class AtomicReferenceFieldUpdater<T, V> {
     ctor protected AtomicReferenceFieldUpdater();
     method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator<V>);
     method public abstract boolean compareAndSet(T, V, V);
@@ -61704,13 +61704,13 @@
     method public V getAndSet(T, V);
     method public final V getAndUpdate(T, java.util.function.UnaryOperator<V>);
     method public abstract void lazySet(T, V);
-    method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
+    method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U, W> newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String);
     method public abstract void set(T, V);
     method public final V updateAndGet(T, java.util.function.UnaryOperator<V>);
     method public abstract boolean weakCompareAndSet(T, V, V);
   }
 
-  public class AtomicStampedReference {
+  public class AtomicStampedReference<V> {
     ctor public AtomicStampedReference(V, int);
     method public boolean attemptStamp(V, int);
     method public boolean compareAndSet(V, V, int, int);
@@ -62013,33 +62013,33 @@
 
 package java.util.function {
 
-  public abstract interface BiConsumer {
+  public abstract interface BiConsumer<T, U> {
     method public abstract void accept(T, U);
     method public default java.util.function.BiConsumer<T, U> andThen(java.util.function.BiConsumer<? super T, ? super U>);
   }
 
-  public abstract interface BiFunction {
-    method public default java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
+  public abstract interface BiFunction<T, U, R> {
+    method public default <V> java.util.function.BiFunction<T, U, V> andThen(java.util.function.Function<? super R, ? extends V>);
     method public abstract R apply(T, U);
   }
 
-  public abstract interface BiPredicate {
+  public abstract interface BiPredicate<T, U> {
     method public default java.util.function.BiPredicate<T, U> and(java.util.function.BiPredicate<? super T, ? super U>);
     method public default java.util.function.BiPredicate<T, U> negate();
     method public default java.util.function.BiPredicate<T, U> or(java.util.function.BiPredicate<? super T, ? super U>);
     method public abstract boolean test(T, U);
   }
 
-  public abstract interface BinaryOperator implements java.util.function.BiFunction {
-    method public static java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
-    method public static java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
+  public abstract interface BinaryOperator<T> implements java.util.function.BiFunction {
+    method public static <T> java.util.function.BinaryOperator<T> maxBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.function.BinaryOperator<T> minBy(java.util.Comparator<? super T>);
   }
 
   public abstract interface BooleanSupplier {
     method public abstract boolean getAsBoolean();
   }
 
-  public abstract interface Consumer {
+  public abstract interface Consumer<T> {
     method public abstract void accept(T);
     method public default java.util.function.Consumer<T> andThen(java.util.function.Consumer<? super T>);
   }
@@ -62053,7 +62053,7 @@
     method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
   }
 
-  public abstract interface DoubleFunction {
+  public abstract interface DoubleFunction<R> {
     method public abstract R apply(double);
   }
 
@@ -62083,11 +62083,11 @@
     method public static java.util.function.DoubleUnaryOperator identity();
   }
 
-  public abstract interface Function {
-    method public default java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
+  public abstract interface Function<T, R> {
+    method public default <V> java.util.function.Function<T, V> andThen(java.util.function.Function<? super R, ? extends V>);
     method public abstract R apply(T);
-    method public default java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
-    method public static java.util.function.Function<T, T> identity();
+    method public default <V> java.util.function.Function<V, R> compose(java.util.function.Function<? super V, ? extends T>);
+    method public static <T> java.util.function.Function<T, T> identity();
   }
 
   public abstract interface IntBinaryOperator {
@@ -62099,7 +62099,7 @@
     method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
   }
 
-  public abstract interface IntFunction {
+  public abstract interface IntFunction<R> {
     method public abstract R apply(int);
   }
 
@@ -62138,7 +62138,7 @@
     method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
   }
 
-  public abstract interface LongFunction {
+  public abstract interface LongFunction<R> {
     method public abstract R apply(long);
   }
 
@@ -62168,56 +62168,56 @@
     method public static java.util.function.LongUnaryOperator identity();
   }
 
-  public abstract interface ObjDoubleConsumer {
+  public abstract interface ObjDoubleConsumer<T> {
     method public abstract void accept(T, double);
   }
 
-  public abstract interface ObjIntConsumer {
+  public abstract interface ObjIntConsumer<T> {
     method public abstract void accept(T, int);
   }
 
-  public abstract interface ObjLongConsumer {
+  public abstract interface ObjLongConsumer<T> {
     method public abstract void accept(T, long);
   }
 
-  public abstract interface Predicate {
+  public abstract interface Predicate<T> {
     method public default java.util.function.Predicate<T> and(java.util.function.Predicate<? super T>);
-    method public static java.util.function.Predicate<T> isEqual(java.lang.Object);
+    method public static <T> java.util.function.Predicate<T> isEqual(java.lang.Object);
     method public default java.util.function.Predicate<T> negate();
     method public default java.util.function.Predicate<T> or(java.util.function.Predicate<? super T>);
     method public abstract boolean test(T);
   }
 
-  public abstract interface Supplier {
+  public abstract interface Supplier<T> {
     method public abstract T get();
   }
 
-  public abstract interface ToDoubleBiFunction {
+  public abstract interface ToDoubleBiFunction<T, U> {
     method public abstract double applyAsDouble(T, U);
   }
 
-  public abstract interface ToDoubleFunction {
+  public abstract interface ToDoubleFunction<T> {
     method public abstract double applyAsDouble(T);
   }
 
-  public abstract interface ToIntBiFunction {
+  public abstract interface ToIntBiFunction<T, U> {
     method public abstract int applyAsInt(T, U);
   }
 
-  public abstract interface ToIntFunction {
+  public abstract interface ToIntFunction<T> {
     method public abstract int applyAsInt(T);
   }
 
-  public abstract interface ToLongBiFunction {
+  public abstract interface ToLongBiFunction<T, U> {
     method public abstract long applyAsLong(T, U);
   }
 
-  public abstract interface ToLongFunction {
+  public abstract interface ToLongFunction<T> {
     method public abstract long applyAsLong(T);
   }
 
-  public abstract interface UnaryOperator implements java.util.function.Function {
-    method public static java.util.function.UnaryOperator<T> identity();
+  public abstract interface UnaryOperator<T> implements java.util.function.Function {
+    method public static <T> java.util.function.UnaryOperator<T> identity();
   }
 
 }
@@ -62805,7 +62805,7 @@
 
 package java.util.stream {
 
-  public abstract interface BaseStream implements java.lang.AutoCloseable {
+  public abstract interface BaseStream<T, S extends java.util.stream.BaseStream<T, S>> implements java.lang.AutoCloseable {
     method public abstract void close();
     method public abstract boolean isParallel();
     method public abstract java.util.Iterator<T> iterator();
@@ -62816,13 +62816,13 @@
     method public abstract S unordered();
   }
 
-  public abstract interface Collector {
+  public abstract interface Collector<T, A, R> {
     method public abstract java.util.function.BiConsumer<A, T> accumulator();
     method public abstract java.util.Set<java.util.stream.Collector.Characteristics> characteristics();
     method public abstract java.util.function.BinaryOperator<A> combiner();
     method public abstract java.util.function.Function<A, R> finisher();
-    method public static java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
-    method public static java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
+    method public static <T, R> java.util.stream.Collector<T, R, R> of(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, T>, java.util.function.BinaryOperator<R>, java.util.stream.Collector.Characteristics...);
+    method public static <T, A, R> java.util.stream.Collector<T, A, R> of(java.util.function.Supplier<A>, java.util.function.BiConsumer<A, T>, java.util.function.BinaryOperator<A>, java.util.function.Function<A, R>, java.util.stream.Collector.Characteristics...);
     method public abstract java.util.function.Supplier<A> supplier();
   }
 
@@ -62835,43 +62835,43 @@
   }
 
   public final class Collectors {
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Long> counting();
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> averagingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, A, R, RR> java.util.stream.Collector<T, A, RR> collectingAndThen(java.util.stream.Collector<T, A, R>, java.util.function.Function<R, RR>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> counting();
+    method public static <T, K> java.util.stream.Collector<T, ?, java.util.Map<K, java.util.List<T>>> groupingBy(java.util.function.Function<? super T, ? extends K>);
+    method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.Map<K, D>> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K, D, A, M extends java.util.Map<K, D>> java.util.stream.Collector<T, ?, M> groupingBy(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, java.util.List<T>>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>);
+    method public static <T, K, A, D> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, D>> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T, K, A, D, M extends java.util.concurrent.ConcurrentMap<K, D>> java.util.stream.Collector<T, ?, M> groupingByConcurrent(java.util.function.Function<? super T, ? extends K>, java.util.function.Supplier<M>, java.util.stream.Collector<? super T, A, D>);
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining();
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence);
     method public static java.util.stream.Collector<java.lang.CharSequence, ?, java.lang.String> joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence);
-    method public static java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
-    method public static java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
-    method public static java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
-    method public static java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
-    method public static java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
-    method public static java.util.stream.Collector<T, ?, java.util.List<T>> toList();
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
-    method public static java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
-    method public static java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
-    method public static java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
+    method public static <T, U, A, R> java.util.stream.Collector<T, ?, R> mapping(java.util.function.Function<? super T, ? extends U>, java.util.stream.Collector<? super U, A, R>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> maxBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> minBy(java.util.Comparator<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, java.util.List<T>>> partitioningBy(java.util.function.Predicate<? super T>);
+    method public static <T, D, A> java.util.stream.Collector<T, ?, java.util.Map<java.lang.Boolean, D>> partitioningBy(java.util.function.Predicate<? super T>, java.util.stream.Collector<? super T, A, D>);
+    method public static <T> java.util.stream.Collector<T, ?, T> reducing(T, java.util.function.BinaryOperator<T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Optional<T>> reducing(java.util.function.BinaryOperator<T>);
+    method public static <T, U> java.util.stream.Collector<T, ?, U> reducing(U, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.DoubleSummaryStatistics> summarizingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.IntSummaryStatistics> summarizingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.LongSummaryStatistics> summarizingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Double> summingDouble(java.util.function.ToDoubleFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Integer> summingInt(java.util.function.ToIntFunction<? super T>);
+    method public static <T> java.util.stream.Collector<T, ?, java.lang.Long> summingLong(java.util.function.ToLongFunction<? super T>);
+    method public static <T, C extends java.util.Collection<T>> java.util.stream.Collector<T, ?, C> toCollection(java.util.function.Supplier<C>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.concurrent.ConcurrentMap<K, U>> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T, K, U, M extends java.util.concurrent.ConcurrentMap<K, U>> java.util.stream.Collector<T, ?, M> toConcurrentMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.List<T>> toList();
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>);
+    method public static <T, K, U> java.util.stream.Collector<T, ?, java.util.Map<K, U>> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>);
+    method public static <T, K, U, M extends java.util.Map<K, U>> java.util.stream.Collector<T, ?, M> toMap(java.util.function.Function<? super T, ? extends K>, java.util.function.Function<? super T, ? extends U>, java.util.function.BinaryOperator<U>, java.util.function.Supplier<M>);
+    method public static <T> java.util.stream.Collector<T, ?, java.util.Set<T>> toSet();
   }
 
   public abstract interface DoubleStream implements java.util.stream.BaseStream {
@@ -62880,7 +62880,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Double> boxed();
     method public static java.util.stream.DoubleStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjDoubleConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
     method public abstract long count();
     method public abstract java.util.stream.DoubleStream distinct();
@@ -62898,7 +62898,7 @@
     method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.DoubleFunction<? extends U>);
     method public abstract java.util.OptionalDouble max();
     method public abstract java.util.OptionalDouble min();
     method public abstract boolean noneMatch(java.util.function.DoublePredicate);
@@ -62931,7 +62931,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Integer> boxed();
     method public static java.util.stream.IntStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjIntConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
     method public abstract long count();
     method public abstract java.util.stream.IntStream distinct();
@@ -62949,7 +62949,7 @@
     method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.IntFunction<? extends U>);
     method public abstract java.util.OptionalInt max();
     method public abstract java.util.OptionalInt min();
     method public abstract boolean noneMatch(java.util.function.IntPredicate);
@@ -62983,7 +62983,7 @@
     method public abstract java.util.OptionalDouble average();
     method public abstract java.util.stream.Stream<java.lang.Long> boxed();
     method public static java.util.stream.LongStream.Builder builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.ObjLongConsumer<R>, java.util.function.BiConsumer<R, R>);
     method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
     method public abstract long count();
     method public abstract java.util.stream.LongStream distinct();
@@ -63001,7 +63001,7 @@
     method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
-    method public abstract java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
+    method public abstract <U> java.util.stream.Stream<U> mapToObj(java.util.function.LongFunction<? extends U>);
     method public abstract java.util.OptionalLong max();
     method public abstract java.util.OptionalLong min();
     method public abstract boolean noneMatch(java.util.function.LongPredicate);
@@ -63028,49 +63028,49 @@
     method public abstract java.util.stream.LongStream build();
   }
 
-  public abstract interface Stream implements java.util.stream.BaseStream {
+  public abstract interface Stream<T> implements java.util.stream.BaseStream {
     method public abstract boolean allMatch(java.util.function.Predicate<? super T>);
     method public abstract boolean anyMatch(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Stream.Builder<T> builder();
-    method public abstract R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
-    method public abstract R collect(java.util.stream.Collector<? super T, A, R>);
-    method public static java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
+    method public static <T> java.util.stream.Stream.Builder<T> builder();
+    method public abstract <R> R collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R, ? super T>, java.util.function.BiConsumer<R, R>);
+    method public abstract <R, A> R collect(java.util.stream.Collector<? super T, A, R>);
+    method public static <T> java.util.stream.Stream<T> concat(java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>);
     method public abstract long count();
     method public abstract java.util.stream.Stream<T> distinct();
-    method public static java.util.stream.Stream<T> empty();
+    method public static <T> java.util.stream.Stream<T> empty();
     method public abstract java.util.stream.Stream<T> filter(java.util.function.Predicate<? super T>);
     method public abstract java.util.Optional<T> findAny();
     method public abstract java.util.Optional<T> findFirst();
-    method public abstract java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
+    method public abstract <R> java.util.stream.Stream<R> flatMap(java.util.function.Function<? super T, ? extends java.util.stream.Stream<? extends R>>);
     method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function<? super T, ? extends java.util.stream.DoubleStream>);
     method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function<? super T, ? extends java.util.stream.IntStream>);
     method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function<? super T, ? extends java.util.stream.LongStream>);
     method public abstract void forEach(java.util.function.Consumer<? super T>);
     method public abstract void forEachOrdered(java.util.function.Consumer<? super T>);
-    method public static java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
-    method public static java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
+    method public static <T> java.util.stream.Stream<T> generate(java.util.function.Supplier<T>);
+    method public static <T> java.util.stream.Stream<T> iterate(T, java.util.function.UnaryOperator<T>);
     method public abstract java.util.stream.Stream<T> limit(long);
-    method public abstract java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
+    method public abstract <R> java.util.stream.Stream<R> map(java.util.function.Function<? super T, ? extends R>);
     method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction<? super T>);
     method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction<? super T>);
     method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction<? super T>);
     method public abstract java.util.Optional<T> max(java.util.Comparator<? super T>);
     method public abstract java.util.Optional<T> min(java.util.Comparator<? super T>);
     method public abstract boolean noneMatch(java.util.function.Predicate<? super T>);
-    method public static java.util.stream.Stream<T> of(T);
-    method public static java.util.stream.Stream<T> of(T...);
+    method public static <T> java.util.stream.Stream<T> of(T);
+    method public static <T> java.util.stream.Stream<T> of(T...);
     method public abstract java.util.stream.Stream<T> peek(java.util.function.Consumer<? super T>);
     method public abstract T reduce(T, java.util.function.BinaryOperator<T>);
     method public abstract java.util.Optional<T> reduce(java.util.function.BinaryOperator<T>);
-    method public abstract U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
+    method public abstract <U> U reduce(U, java.util.function.BiFunction<U, ? super T, U>, java.util.function.BinaryOperator<U>);
     method public abstract java.util.stream.Stream<T> skip(long);
     method public abstract java.util.stream.Stream<T> sorted();
     method public abstract java.util.stream.Stream<T> sorted(java.util.Comparator<? super T>);
     method public abstract java.lang.Object[] toArray();
-    method public abstract A[] toArray(java.util.function.IntFunction<A[]>);
+    method public abstract <A> A[] toArray(java.util.function.IntFunction<A[]>);
   }
 
-  public static abstract interface Stream.Builder implements java.util.function.Consumer {
+  public static abstract interface Stream.Builder<T> implements java.util.function.Consumer {
     method public abstract void accept(T);
     method public default java.util.stream.Stream.Builder<T> add(T);
     method public abstract java.util.stream.Stream<T> build();
@@ -63083,8 +63083,8 @@
     method public static java.util.stream.IntStream intStream(java.util.function.Supplier<? extends java.util.Spliterator.OfInt>, int, boolean);
     method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean);
     method public static java.util.stream.LongStream longStream(java.util.function.Supplier<? extends java.util.Spliterator.OfLong>, int, boolean);
-    method public static java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean);
-    method public static java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean);
+    method public static <T> java.util.stream.Stream<T> stream(java.util.Spliterator<T>, boolean);
+    method public static <T> java.util.stream.Stream<T> stream(java.util.function.Supplier<? extends java.util.Spliterator<T>>, int, boolean);
   }
 
 }
@@ -65257,16 +65257,16 @@
   public final class Subject implements java.io.Serializable {
     ctor public Subject();
     ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>);
-    method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>);
-    method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
-    method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
-    method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
+    method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedAction<T>);
+    method public static <T> T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
+    method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction<T>, java.security.AccessControlContext);
+    method public static <T> T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
     method public java.util.Set<java.security.Principal> getPrincipals();
-    method public java.util.Set<T> getPrincipals(java.lang.Class<T>);
+    method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(java.lang.Class<T>);
     method public java.util.Set<java.lang.Object> getPrivateCredentials();
-    method public java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
+    method public <T> java.util.Set<T> getPrivateCredentials(java.lang.Class<T>);
     method public java.util.Set<java.lang.Object> getPublicCredentials();
-    method public java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
+    method public <T> java.util.Set<T> getPublicCredentials(java.lang.Class<T>);
     method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
     method public boolean isReadOnly();
     method public void setReadOnly();