wip
diff --git a/pkgs/jni/CHANGELOG.md b/pkgs/jni/CHANGELOG.md
index b73d2b6..76177d3 100644
--- a/pkgs/jni/CHANGELOG.md
+++ b/pkgs/jni/CHANGELOG.md
@@ -14,6 +14,8 @@
   use `Jni.androidApplicationContext(engineId)` to access the application
   context and use `Jni.androidActivity(engineId)` to acccess the activity.
 - Update to the latest lints.
+- **Breaking Change**: `JArray`'s unnamed constructor is now
+  `JArray.withLength`.
 
 ## 0.14.2
 
diff --git a/pkgs/jni/lib/_internal.dart b/pkgs/jni/lib/_internal.dart
index 9c0db34..40cef7f 100644
--- a/pkgs/jni/lib/_internal.dart
+++ b/pkgs/jni/lib/_internal.dart
@@ -28,54 +28,31 @@
 export 'package:meta/meta.dart' show internal;
 
 export 'src/accessors.dart';
-export 'src/jarray.dart'
-    show
-        $JArray$NullableType$,
-        $JArray$Type$,
-        $JBooleanArray$NullableType$,
-        $JBooleanArray$Type$,
-        $JByteArray$NullableType$,
-        $JByteArray$Type$,
-        $JCharArray$NullableType$,
-        $JCharArray$Type$,
-        $JDoubleArray$NullableType$,
-        $JDoubleArray$Type$,
-        $JFloatArray$NullableType$,
-        $JFloatArray$Type$,
-        $JIntArray$NullableType$,
-        $JIntArray$Type$,
-        $JLongArray$NullableType$,
-        $JLongArray$Type$,
-        $JShortArray$NullableType$,
-        $JShortArray$Type$;
 export 'src/jni.dart' show ProtectedJniExtensions;
-export 'src/jobject.dart' show $JObject$NullableType$, $JObject$Type$;
+export 'src/jobject.dart' show $JObject$Type$;
 export 'src/jreference.dart';
 export 'src/kotlin.dart'
     show coroutineSingletonsClass, failureExceptionField, result$FailureClass;
-export 'src/lang/jboolean.dart' show $JBoolean$NullableType$, $JBoolean$Type$;
-export 'src/lang/jbyte.dart' show $JByte$NullableType$, $JByte$Type$;
-export 'src/lang/jcharacter.dart'
-    show $JCharacter$NullableType$, $JCharacter$Type$;
-export 'src/lang/jdouble.dart' show $JDouble$NullableType$, $JDouble$Type$;
-export 'src/lang/jfloat.dart' show $JFloat$NullableType$, $JFloat$Type$;
-export 'src/lang/jinteger.dart' show $JInteger$NullableType$, $JInteger$Type$;
-export 'src/lang/jlong.dart' show $JLong$NullableType$, $JLong$Type$;
-export 'src/lang/jnumber.dart' show $JNumber$NullableType$, $JNumber$Type$;
-export 'src/lang/jshort.dart' show $JShort$NullableType$, $JShort$Type$;
-export 'src/lang/jstring.dart' show $JString$NullableType$, $JString$Type$;
+export 'src/lang/jboolean.dart';
+export 'src/lang/jbyte.dart';
+export 'src/lang/jcharacter.dart';
+export 'src/lang/jdouble.dart';
+export 'src/lang/jfloat.dart';
+export 'src/lang/jinteger.dart';
+export 'src/lang/jlong.dart';
+export 'src/lang/jnumber.dart';
+export 'src/lang/jshort.dart';
+export 'src/lang/jstring.dart';
 export 'src/method_invocation.dart';
-export 'src/nio/jbuffer.dart' show $JBuffer$NullableType$, $JBuffer$Type$;
-export 'src/nio/jbyte_buffer.dart'
-    show $JByteBuffer$NullableType$, $JByteBuffer$Type$;
+export 'src/nio/jbuffer.dart';
+export 'src/nio/jbyte_buffer.dart';
 export 'src/third_party/generated_bindings.dart'
     show JFieldIDPtr, JMethodIDPtr, JObjectPtr, JThrowablePtr, JniResult;
-export 'src/types.dart' show JTypeBase, lowestCommonSuperType, referenceType;
-export 'src/util/jiterator.dart'
-    show $JIterator$NullableType$, $JIterator$Type$;
-export 'src/util/jlist.dart' show $JList$NullableType$, $JList$Type$;
-export 'src/util/jmap.dart' show $JMap$NullableType$, $JMap$Type$;
-export 'src/util/jset.dart' show $JSet$NullableType$, $JSet$Type$;
+export 'src/types.dart' show JTypeBase, referenceType;
+export 'src/util/jiterator.dart';
+export 'src/util/jlist.dart';
+export 'src/util/jmap.dart';
+export 'src/util/jset.dart';
 
 /// Temporary fix for the macOS arm64 varargs problem.
 ///
diff --git a/pkgs/jni/lib/core_bindings/java/util/Iterator.dart b/pkgs/jni/lib/core_bindings/java/util/Iterator.dart
new file mode 100644
index 0000000..1745f7c
--- /dev/null
+++ b/pkgs/jni/lib/core_bindings/java/util/Iterator.dart
@@ -0,0 +1,299 @@
+// AUTO GENERATED BY JNIGEN 0.15.0. DO NOT EDIT!
+
+// ignore_for_file: annotate_overrides
+// ignore_for_file: argument_type_not_assignable
+// ignore_for_file: camel_case_extensions
+// ignore_for_file: camel_case_types
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: comment_references
+// ignore_for_file: doc_directive_unknown
+// ignore_for_file: file_names
+// ignore_for_file: inference_failure_on_untyped_parameter
+// ignore_for_file: invalid_internal_annotation
+// ignore_for_file: invalid_use_of_internal_member
+// ignore_for_file: library_prefixes
+// ignore_for_file: lines_longer_than_80_chars
+// ignore_for_file: no_leading_underscores_for_library_prefixes
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+// ignore_for_file: non_constant_identifier_names
+// ignore_for_file: only_throw_errors
+// ignore_for_file: overridden_fields
+// ignore_for_file: prefer_double_quotes
+// ignore_for_file: unintended_html_in_doc_comment
+// ignore_for_file: unnecessary_cast
+// ignore_for_file: unnecessary_non_null_assertion
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: unused_element
+// ignore_for_file: unused_field
+// ignore_for_file: unused_import
+// ignore_for_file: unused_local_variable
+// ignore_for_file: unused_shown_name
+// ignore_for_file: use_super_parameters
+
+import 'dart:core' show Object, String, bool, double, int;
+import 'dart:core' as core$_;
+
+import 'package:jni/_internal.dart' as jni$_;
+import 'package:jni/jni.dart' as jni$_;
+
+/// from: `java.util.Iterator`
+extension type Iterator<$E extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
+  static final _class = jni$_.JClass.forName(r'java/util/Iterator');
+
+  /// The type which includes information such as the signature of this class.
+  static const jni$_.JType<Iterator> type = $Iterator$Type$();
+  static final _id_hasNext = _class.instanceMethodId(
+    r'hasNext',
+    r'()Z',
+  );
+
+  static final _hasNext = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract boolean hasNext()`
+  bool hasNext() {
+    return _hasNext(reference.pointer, _id_hasNext as jni$_.JMethodIDPtr)
+        .boolean;
+  }
+
+  static final _id_next = _class.instanceMethodId(
+    r'next',
+    r'()Ljava/lang/Object;',
+  );
+
+  static final _next = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract E next()`
+  /// The returned object must be released after use, by calling the [release] method.
+  $E? next() {
+    return _next(reference.pointer, _id_next as jni$_.JMethodIDPtr)
+        .object<$E?>();
+  }
+
+  static final _id_remove = _class.instanceMethodId(
+    r'remove',
+    r'()V',
+  );
+
+  static final _remove = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JThrowablePtr Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallVoidMethod')
+      .asFunction<
+          jni$_.JThrowablePtr Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public void remove()`
+  void remove() {
+    _remove(reference.pointer, _id_remove as jni$_.JMethodIDPtr).check();
+  }
+
+  static final _id_forEachRemaining = _class.instanceMethodId(
+    r'forEachRemaining',
+    r'(Ljava/util/function/Consumer;)V',
+  );
+
+  static final _forEachRemaining = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JThrowablePtr Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallVoidMethod')
+      .asFunction<
+          jni$_.JThrowablePtr Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public void forEachRemaining(java.util.function.Consumer<? super E> consumer)`
+  void forEachRemaining(
+    jni$_.JObject? consumer,
+  ) {
+    final _$consumer = consumer?.reference ?? jni$_.jNullReference;
+    _forEachRemaining(reference.pointer,
+            _id_forEachRemaining as jni$_.JMethodIDPtr, _$consumer.pointer)
+        .check();
+  }
+
+  /// Maps a specific port to the implemented interface.
+  static final core$_.Map<int, $Iterator> _$impls = {};
+  static jni$_.JObjectPtr _$invoke(
+    int port,
+    jni$_.JObjectPtr descriptor,
+    jni$_.JObjectPtr args,
+  ) {
+    return _$invokeMethod(
+      port,
+      jni$_.MethodInvocation.fromAddresses(
+        0,
+        descriptor.address,
+        args.address,
+      ),
+    );
+  }
+
+  static final jni$_.Pointer<
+          jni$_.NativeFunction<
+              jni$_.JObjectPtr Function(
+                  jni$_.Int64, jni$_.JObjectPtr, jni$_.JObjectPtr)>>
+      _$invokePointer = jni$_.Pointer.fromFunction(_$invoke);
+
+  static jni$_.Pointer<jni$_.Void> _$invokeMethod(
+    int $p,
+    jni$_.MethodInvocation $i,
+  ) {
+    try {
+      final $d = $i.methodDescriptor.toDartString(releaseOriginal: true);
+      final $a = $i.args;
+      if ($d == r'hasNext()Z') {
+        final $r = _$impls[$p]!.hasNext();
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'next()Ljava/lang/Object;') {
+        final $r = _$impls[$p]!.next();
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'remove()V') {
+        _$impls[$p]!.remove();
+        return jni$_.nullptr;
+      }
+      if ($d == r'forEachRemaining(Ljava/util/function/Consumer;)V') {
+        _$impls[$p]!.forEachRemaining(
+          $a![0],
+        );
+        return jni$_.nullptr;
+      }
+    } catch (e) {
+      return jni$_.ProtectedJniExtensions.newDartException(e);
+    }
+    return jni$_.nullptr;
+  }
+
+  static void implementIn<$E extends jni$_.JObject?>(
+    jni$_.JImplementer implementer,
+    $Iterator<$E> $impl,
+  ) {
+    late final jni$_.RawReceivePort $p;
+    $p = jni$_.RawReceivePort(($m) {
+      if ($m == null) {
+        _$impls.remove($p.sendPort.nativePort);
+        $p.close();
+        return;
+      }
+      final $i = jni$_.MethodInvocation.fromMessage($m);
+      final $r = _$invokeMethod($p.sendPort.nativePort, $i);
+      jni$_.ProtectedJniExtensions.returnResult($i.result, $r);
+    });
+    implementer.add(
+      r'java.util.Iterator',
+      $p,
+      _$invokePointer,
+      [
+        if ($impl.remove$async) r'remove()V',
+        if ($impl.forEachRemaining$async)
+          r'forEachRemaining(Ljava/util/function/Consumer;)V',
+      ],
+    );
+    final $a = $p.sendPort.nativePort;
+    _$impls[$a] = $impl;
+  }
+
+  factory Iterator.implement(
+    $Iterator<$E> $impl,
+  ) {
+    final $i = jni$_.JImplementer();
+    implementIn($i, $impl);
+    return $i.implement<Iterator<$E>>();
+  }
+}
+
+abstract base mixin class $Iterator<$E extends jni$_.JObject?> {
+  factory $Iterator({
+    required bool Function() hasNext,
+    required $E? Function() next,
+    required void Function() remove,
+    bool remove$async,
+    required void Function(jni$_.JObject? consumer) forEachRemaining,
+    bool forEachRemaining$async,
+  }) = _$Iterator<$E>;
+
+  bool hasNext();
+  $E? next();
+  void remove();
+  bool get remove$async => false;
+  void forEachRemaining(jni$_.JObject? consumer);
+  bool get forEachRemaining$async => false;
+}
+
+final class _$Iterator<$E extends jni$_.JObject?> with $Iterator<$E> {
+  _$Iterator({
+    required bool Function() hasNext,
+    required $E? Function() next,
+    required void Function() remove,
+    this.remove$async = false,
+    required void Function(jni$_.JObject? consumer) forEachRemaining,
+    this.forEachRemaining$async = false,
+  })  : _hasNext = hasNext,
+        _next = next,
+        _remove = remove,
+        _forEachRemaining = forEachRemaining;
+
+  final bool Function() _hasNext;
+  final $E? Function() _next;
+  final void Function() _remove;
+  final bool remove$async;
+  final void Function(jni$_.JObject? consumer) _forEachRemaining;
+  final bool forEachRemaining$async;
+
+  bool hasNext() {
+    return _hasNext();
+  }
+
+  $E? next() {
+    return _next();
+  }
+
+  void remove() {
+    return _remove();
+  }
+
+  void forEachRemaining(jni$_.JObject? consumer) {
+    return _forEachRemaining(consumer);
+  }
+}
+
+final class $Iterator$Type$ extends jni$_.JType<Iterator> {
+  @jni$_.internal
+  const $Iterator$Type$();
+
+  @jni$_.internal
+  @core$_.override
+  String get signature => r'Ljava/util/Iterator;';
+}
diff --git a/pkgs/jni/lib/core_bindings/java/util/List.dart b/pkgs/jni/lib/core_bindings/java/util/List.dart
new file mode 100644
index 0000000..adb1fe2
--- /dev/null
+++ b/pkgs/jni/lib/core_bindings/java/util/List.dart
@@ -0,0 +1,2508 @@
+// AUTO GENERATED BY JNIGEN 0.15.0. DO NOT EDIT!
+
+// ignore_for_file: annotate_overrides
+// ignore_for_file: argument_type_not_assignable
+// ignore_for_file: camel_case_extensions
+// ignore_for_file: camel_case_types
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: comment_references
+// ignore_for_file: doc_directive_unknown
+// ignore_for_file: file_names
+// ignore_for_file: inference_failure_on_untyped_parameter
+// ignore_for_file: invalid_internal_annotation
+// ignore_for_file: invalid_use_of_internal_member
+// ignore_for_file: library_prefixes
+// ignore_for_file: lines_longer_than_80_chars
+// ignore_for_file: no_leading_underscores_for_library_prefixes
+// ignore_for_file: no_leading_underscores_for_local_identifiers
+// ignore_for_file: non_constant_identifier_names
+// ignore_for_file: only_throw_errors
+// ignore_for_file: overridden_fields
+// ignore_for_file: prefer_double_quotes
+// ignore_for_file: unintended_html_in_doc_comment
+// ignore_for_file: unnecessary_cast
+// ignore_for_file: unnecessary_non_null_assertion
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: unused_element
+// ignore_for_file: unused_field
+// ignore_for_file: unused_import
+// ignore_for_file: unused_local_variable
+// ignore_for_file: unused_shown_name
+// ignore_for_file: use_super_parameters
+
+import 'dart:core' show Object, String, bool, double, int;
+import 'dart:core' as core$_;
+
+import 'package:jni/_internal.dart' as jni$_;
+import 'package:jni/jni.dart' as jni$_;
+
+import 'Iterator.dart' as iterator$_;
+
+/// from: `java.util.List`
+extension type List<$E extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
+  static final _class = jni$_.JClass.forName(r'java/util/List');
+
+  /// The type which includes information such as the signature of this class.
+  static const jni$_.JType<List> type = $List$Type$();
+  static final _id_size = _class.instanceMethodId(
+    r'size',
+    r'()I',
+  );
+
+  static final _size = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallIntMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract int size()`
+  int size() {
+    return _size(reference.pointer, _id_size as jni$_.JMethodIDPtr).integer;
+  }
+
+  static final _id_isEmpty = _class.instanceMethodId(
+    r'isEmpty',
+    r'()Z',
+  );
+
+  static final _isEmpty = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract boolean isEmpty()`
+  bool isEmpty() {
+    return _isEmpty(reference.pointer, _id_isEmpty as jni$_.JMethodIDPtr)
+        .boolean;
+  }
+
+  static final _id_contains = _class.instanceMethodId(
+    r'contains',
+    r'(Ljava/lang/Object;)Z',
+  );
+
+  static final _contains = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean contains(java.lang.Object object)`
+  bool contains(
+    jni$_.JObject? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _contains(reference.pointer, _id_contains as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .boolean;
+  }
+
+  static final _id_iterator = _class.instanceMethodId(
+    r'iterator',
+    r'()Ljava/util/Iterator;',
+  );
+
+  static final _iterator = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract java.util.Iterator<E> iterator()`
+  /// The returned object must be released after use, by calling the [release] method.
+  iterator$_.Iterator<$E?>? iterator() {
+    return _iterator(reference.pointer, _id_iterator as jni$_.JMethodIDPtr)
+        .object<iterator$_.Iterator<$E?>?>();
+  }
+
+  static final _id_toArray = _class.instanceMethodId(
+    r'toArray',
+    r'()[Ljava/lang/Object;',
+  );
+
+  static final _toArray = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract java.lang.Object[] toArray()`
+  /// The returned object must be released after use, by calling the [release] method.
+  jni$_.JArray<jni$_.JObject?>? toArray() {
+    return _toArray(reference.pointer, _id_toArray as jni$_.JMethodIDPtr)
+        .object<jni$_.JArray<jni$_.JObject?>?>();
+  }
+
+  static final _id_toArray$1 = _class.instanceMethodId(
+    r'toArray',
+    r'([Ljava/lang/Object;)[Ljava/lang/Object;',
+  );
+
+  static final _toArray$1 = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract T[] toArray(T[] objects)`
+  /// The returned object must be released after use, by calling the [release] method.
+  jni$_.JArray<$T?>? toArray$1<$T extends jni$_.JObject?>(
+    jni$_.JArray<$T?>? objects,
+  ) {
+    final _$objects = objects?.reference ?? jni$_.jNullReference;
+    return _toArray$1(reference.pointer, _id_toArray$1 as jni$_.JMethodIDPtr,
+            _$objects.pointer)
+        .object<jni$_.JArray<$T?>?>();
+  }
+
+  static final _id_add = _class.instanceMethodId(
+    r'add',
+    r'(Ljava/lang/Object;)Z',
+  );
+
+  static final _add = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean add(E object)`
+  bool add(
+    $E? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _add(
+            reference.pointer, _id_add as jni$_.JMethodIDPtr, _$object.pointer)
+        .boolean;
+  }
+
+  static final _id_remove = _class.instanceMethodId(
+    r'remove',
+    r'(Ljava/lang/Object;)Z',
+  );
+
+  static final _remove = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean remove(java.lang.Object object)`
+  bool remove(
+    jni$_.JObject? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _remove(reference.pointer, _id_remove as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .boolean;
+  }
+
+  static final _id_containsAll = _class.instanceMethodId(
+    r'containsAll',
+    r'(Ljava/util/Collection;)Z',
+  );
+
+  static final _containsAll = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean containsAll(java.util.Collection<?> collection)`
+  bool containsAll(
+    jni$_.JObject? collection,
+  ) {
+    final _$collection = collection?.reference ?? jni$_.jNullReference;
+    return _containsAll(reference.pointer,
+            _id_containsAll as jni$_.JMethodIDPtr, _$collection.pointer)
+        .boolean;
+  }
+
+  static final _id_addAll = _class.instanceMethodId(
+    r'addAll',
+    r'(Ljava/util/Collection;)Z',
+  );
+
+  static final _addAll = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean addAll(java.util.Collection<? extends E> collection)`
+  bool addAll(
+    jni$_.JObject? collection,
+  ) {
+    final _$collection = collection?.reference ?? jni$_.jNullReference;
+    return _addAll(reference.pointer, _id_addAll as jni$_.JMethodIDPtr,
+            _$collection.pointer)
+        .boolean;
+  }
+
+  static final _id_addAll$1 = _class.instanceMethodId(
+    r'addAll',
+    r'(ILjava/util/Collection;)Z',
+  );
+
+  static final _addAll$1 = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_
+                          .VarArgs<(jni$_.Int32, jni$_.Pointer<jni$_.Void>)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, int, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean addAll(int i, java.util.Collection<? extends E> collection)`
+  bool addAll$1(
+    int i,
+    jni$_.JObject? collection,
+  ) {
+    final _$collection = collection?.reference ?? jni$_.jNullReference;
+    return _addAll$1(reference.pointer, _id_addAll$1 as jni$_.JMethodIDPtr, i,
+            _$collection.pointer)
+        .boolean;
+  }
+
+  static final _id_removeAll = _class.instanceMethodId(
+    r'removeAll',
+    r'(Ljava/util/Collection;)Z',
+  );
+
+  static final _removeAll = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean removeAll(java.util.Collection<?> collection)`
+  bool removeAll(
+    jni$_.JObject? collection,
+  ) {
+    final _$collection = collection?.reference ?? jni$_.jNullReference;
+    return _removeAll(reference.pointer, _id_removeAll as jni$_.JMethodIDPtr,
+            _$collection.pointer)
+        .boolean;
+  }
+
+  static final _id_retainAll = _class.instanceMethodId(
+    r'retainAll',
+    r'(Ljava/util/Collection;)Z',
+  );
+
+  static final _retainAll = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean retainAll(java.util.Collection<?> collection)`
+  bool retainAll(
+    jni$_.JObject? collection,
+  ) {
+    final _$collection = collection?.reference ?? jni$_.jNullReference;
+    return _retainAll(reference.pointer, _id_retainAll as jni$_.JMethodIDPtr,
+            _$collection.pointer)
+        .boolean;
+  }
+
+  static final _id_replaceAll = _class.instanceMethodId(
+    r'replaceAll',
+    r'(Ljava/util/function/UnaryOperator;)V',
+  );
+
+  static final _replaceAll = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JThrowablePtr Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallVoidMethod')
+      .asFunction<
+          jni$_.JThrowablePtr Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public void replaceAll(java.util.function.UnaryOperator<E> unaryOperator)`
+  void replaceAll(
+    jni$_.JObject? unaryOperator,
+  ) {
+    final _$unaryOperator = unaryOperator?.reference ?? jni$_.jNullReference;
+    _replaceAll(reference.pointer, _id_replaceAll as jni$_.JMethodIDPtr,
+            _$unaryOperator.pointer)
+        .check();
+  }
+
+  static final _id_sort = _class.instanceMethodId(
+    r'sort',
+    r'(Ljava/util/Comparator;)V',
+  );
+
+  static final _sort = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JThrowablePtr Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallVoidMethod')
+      .asFunction<
+          jni$_.JThrowablePtr Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public void sort(java.util.Comparator<? super E> comparator)`
+  void sort(
+    jni$_.JObject? comparator,
+  ) {
+    final _$comparator = comparator?.reference ?? jni$_.jNullReference;
+    _sort(reference.pointer, _id_sort as jni$_.JMethodIDPtr,
+            _$comparator.pointer)
+        .check();
+  }
+
+  static final _id_clear = _class.instanceMethodId(
+    r'clear',
+    r'()V',
+  );
+
+  static final _clear = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JThrowablePtr Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallVoidMethod')
+      .asFunction<
+          jni$_.JThrowablePtr Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract void clear()`
+  void clear() {
+    _clear(reference.pointer, _id_clear as jni$_.JMethodIDPtr).check();
+  }
+
+  static final _id_equals = _class.instanceMethodId(
+    r'equals',
+    r'(Ljava/lang/Object;)Z',
+  );
+
+  static final _equals = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallBooleanMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract boolean equals(java.lang.Object object)`
+  bool equals(
+    jni$_.JObject? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _equals(reference.pointer, _id_equals as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .boolean;
+  }
+
+  static final _id_hashCode$1 = _class.instanceMethodId(
+    r'hashCode',
+    r'()I',
+  );
+
+  static final _hashCode$1 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallIntMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract int hashCode()`
+  int hashCode$1() {
+    return _hashCode$1(reference.pointer, _id_hashCode$1 as jni$_.JMethodIDPtr)
+        .integer;
+  }
+
+  static final _id_get = _class.instanceMethodId(
+    r'get',
+    r'(I)Ljava/lang/Object;',
+  );
+
+  static final _get = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<(jni$_.Int32,)>)>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>, jni$_.JMethodIDPtr, int)>();
+
+  /// from: `public abstract E get(int i)`
+  /// The returned object must be released after use, by calling the [release] method.
+  $E? get(
+    int i,
+  ) {
+    return _get(reference.pointer, _id_get as jni$_.JMethodIDPtr, i)
+        .object<$E?>();
+  }
+
+  static final _id_set = _class.instanceMethodId(
+    r'set',
+    r'(ILjava/lang/Object;)Ljava/lang/Object;',
+  );
+
+  static final _set = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_
+                          .VarArgs<(jni$_.Int32, jni$_.Pointer<jni$_.Void>)>)>>(
+          'globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, int, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract E set(int i, E object)`
+  /// The returned object must be released after use, by calling the [release] method.
+  $E? set(
+    int i,
+    $E? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _set(reference.pointer, _id_set as jni$_.JMethodIDPtr, i,
+            _$object.pointer)
+        .object<$E?>();
+  }
+
+  static final _id_add$1 = _class.instanceMethodId(
+    r'add',
+    r'(ILjava/lang/Object;)V',
+  );
+
+  static final _add$1 = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JThrowablePtr Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_
+                          .VarArgs<(jni$_.Int32, jni$_.Pointer<jni$_.Void>)>)>>(
+          'globalEnv_CallVoidMethod')
+      .asFunction<
+          jni$_.JThrowablePtr Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, int, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract void add(int i, E object)`
+  void add$1(
+    int i,
+    $E? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    _add$1(reference.pointer, _id_add$1 as jni$_.JMethodIDPtr, i,
+            _$object.pointer)
+        .check();
+  }
+
+  static final _id_remove$1 = _class.instanceMethodId(
+    r'remove',
+    r'(I)Ljava/lang/Object;',
+  );
+
+  static final _remove$1 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<(jni$_.Int32,)>)>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>, jni$_.JMethodIDPtr, int)>();
+
+  /// from: `public abstract E remove(int i)`
+  /// The returned object must be released after use, by calling the [release] method.
+  $E? remove$1(
+    int i,
+  ) {
+    return _remove$1(reference.pointer, _id_remove$1 as jni$_.JMethodIDPtr, i)
+        .object<$E?>();
+  }
+
+  static final _id_indexOf = _class.instanceMethodId(
+    r'indexOf',
+    r'(Ljava/lang/Object;)I',
+  );
+
+  static final _indexOf = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallIntMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract int indexOf(java.lang.Object object)`
+  int indexOf(
+    jni$_.JObject? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _indexOf(reference.pointer, _id_indexOf as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .integer;
+  }
+
+  static final _id_lastIndexOf = _class.instanceMethodId(
+    r'lastIndexOf',
+    r'(Ljava/lang/Object;)I',
+  );
+
+  static final _lastIndexOf = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallIntMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `public abstract int lastIndexOf(java.lang.Object object)`
+  int lastIndexOf(
+    jni$_.JObject? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _lastIndexOf(reference.pointer,
+            _id_lastIndexOf as jni$_.JMethodIDPtr, _$object.pointer)
+        .integer;
+  }
+
+  static final _id_listIterator = _class.instanceMethodId(
+    r'listIterator',
+    r'()Ljava/util/ListIterator;',
+  );
+
+  static final _listIterator = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public abstract java.util.ListIterator<E> listIterator()`
+  /// The returned object must be released after use, by calling the [release] method.
+  jni$_.JObject? listIterator() {
+    return _listIterator(
+            reference.pointer, _id_listIterator as jni$_.JMethodIDPtr)
+        .object<jni$_.JObject?>();
+  }
+
+  static final _id_listIterator$1 = _class.instanceMethodId(
+    r'listIterator',
+    r'(I)Ljava/util/ListIterator;',
+  );
+
+  static final _listIterator$1 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<(jni$_.Int32,)>)>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>, jni$_.JMethodIDPtr, int)>();
+
+  /// from: `public abstract java.util.ListIterator<E> listIterator(int i)`
+  /// The returned object must be released after use, by calling the [release] method.
+  jni$_.JObject? listIterator$1(
+    int i,
+  ) {
+    return _listIterator$1(
+            reference.pointer, _id_listIterator$1 as jni$_.JMethodIDPtr, i)
+        .object<jni$_.JObject?>();
+  }
+
+  static final _id_subList = _class.instanceMethodId(
+    r'subList',
+    r'(II)Ljava/util/List;',
+  );
+
+  static final _subList = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Int32, jni$_.Int32)>)>>(
+          'globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>, jni$_.JMethodIDPtr, int, int)>();
+
+  /// from: `public abstract java.util.List<E> subList(int i, int i1)`
+  /// The returned object must be released after use, by calling the [release] method.
+  List<$E?>? subList(
+    int i,
+    int i1,
+  ) {
+    return _subList(reference.pointer, _id_subList as jni$_.JMethodIDPtr, i, i1)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_spliterator = _class.instanceMethodId(
+    r'spliterator',
+    r'()Ljava/util/Spliterator;',
+  );
+
+  static final _spliterator = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `public java.util.Spliterator<E> spliterator()`
+  /// The returned object must be released after use, by calling the [release] method.
+  jni$_.JObject? spliterator() {
+    return _spliterator(
+            reference.pointer, _id_spliterator as jni$_.JMethodIDPtr)
+        .object<jni$_.JObject?>();
+  }
+
+  static final _id_of = _class.staticMethodId(
+    r'of',
+    r'()Ljava/util/List;',
+  );
+
+  static final _of = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                jni$_.Pointer<jni$_.Void>,
+                jni$_.JMethodIDPtr,
+              )>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+            jni$_.Pointer<jni$_.Void>,
+            jni$_.JMethodIDPtr,
+          )>();
+
+  /// from: `static public java.util.List<E> of()`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of<$E extends jni$_.JObject?>() {
+    return _of(_class.reference.pointer, _id_of as jni$_.JMethodIDPtr)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$1 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$1 = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$1<$E extends jni$_.JObject?>(
+    $E? object,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    return _of$1(_class.reference.pointer, _id_of$1 as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$2 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$2 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$2<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    return _of$2(_class.reference.pointer, _id_of$2 as jni$_.JMethodIDPtr,
+            _$object.pointer, _$object1.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$3 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$3 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$3<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    return _of$3(_class.reference.pointer, _id_of$3 as jni$_.JMethodIDPtr,
+            _$object.pointer, _$object1.pointer, _$object2.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$4 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$4 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$4<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    return _of$4(
+            _class.reference.pointer,
+            _id_of$4 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$5 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$5 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3, E object4)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$5<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+    $E? object4,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    final _$object4 = object4?.reference ?? jni$_.jNullReference;
+    return _of$5(
+            _class.reference.pointer,
+            _id_of$5 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer,
+            _$object4.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$6 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$6 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3, E object4, E object5)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$6<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+    $E? object4,
+    $E? object5,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    final _$object4 = object4?.reference ?? jni$_.jNullReference;
+    final _$object5 = object5?.reference ?? jni$_.jNullReference;
+    return _of$6(
+            _class.reference.pointer,
+            _id_of$6 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer,
+            _$object4.pointer,
+            _$object5.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$7 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$7 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3, E object4, E object5, E object6)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$7<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+    $E? object4,
+    $E? object5,
+    $E? object6,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    final _$object4 = object4?.reference ?? jni$_.jNullReference;
+    final _$object5 = object5?.reference ?? jni$_.jNullReference;
+    final _$object6 = object6?.reference ?? jni$_.jNullReference;
+    return _of$7(
+            _class.reference.pointer,
+            _id_of$7 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer,
+            _$object4.pointer,
+            _$object5.pointer,
+            _$object6.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$8 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$8 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3, E object4, E object5, E object6, E object7)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$8<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+    $E? object4,
+    $E? object5,
+    $E? object6,
+    $E? object7,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    final _$object4 = object4?.reference ?? jni$_.jNullReference;
+    final _$object5 = object5?.reference ?? jni$_.jNullReference;
+    final _$object6 = object6?.reference ?? jni$_.jNullReference;
+    final _$object7 = object7?.reference ?? jni$_.jNullReference;
+    return _of$8(
+            _class.reference.pointer,
+            _id_of$8 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer,
+            _$object4.pointer,
+            _$object5.pointer,
+            _$object6.pointer,
+            _$object7.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$9 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$9 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3, E object4, E object5, E object6, E object7, E object8)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$9<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+    $E? object4,
+    $E? object5,
+    $E? object6,
+    $E? object7,
+    $E? object8,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    final _$object4 = object4?.reference ?? jni$_.jNullReference;
+    final _$object5 = object5?.reference ?? jni$_.jNullReference;
+    final _$object6 = object6?.reference ?? jni$_.jNullReference;
+    final _$object7 = object7?.reference ?? jni$_.jNullReference;
+    final _$object8 = object8?.reference ?? jni$_.jNullReference;
+    return _of$9(
+            _class.reference.pointer,
+            _id_of$9 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer,
+            _$object4.pointer,
+            _$object5.pointer,
+            _$object6.pointer,
+            _$object7.pointer,
+            _$object8.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$10 = _class.staticMethodId(
+    r'of',
+    r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$10 = jni$_.ProtectedJniExtensions.lookup<
+          jni$_.NativeFunction<
+              jni$_.JniResult Function(
+                  jni$_.Pointer<jni$_.Void>,
+                  jni$_.JMethodIDPtr,
+                  jni$_.VarArgs<
+                      (
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>,
+                        jni$_.Pointer<jni$_.Void>
+                      )>)>>('globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>,
+              jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E object, E object1, E object2, E object3, E object4, E object5, E object6, E object7, E object8, E object9)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$10<$E extends jni$_.JObject?>(
+    $E? object,
+    $E? object1,
+    $E? object2,
+    $E? object3,
+    $E? object4,
+    $E? object5,
+    $E? object6,
+    $E? object7,
+    $E? object8,
+    $E? object9,
+  ) {
+    final _$object = object?.reference ?? jni$_.jNullReference;
+    final _$object1 = object1?.reference ?? jni$_.jNullReference;
+    final _$object2 = object2?.reference ?? jni$_.jNullReference;
+    final _$object3 = object3?.reference ?? jni$_.jNullReference;
+    final _$object4 = object4?.reference ?? jni$_.jNullReference;
+    final _$object5 = object5?.reference ?? jni$_.jNullReference;
+    final _$object6 = object6?.reference ?? jni$_.jNullReference;
+    final _$object7 = object7?.reference ?? jni$_.jNullReference;
+    final _$object8 = object8?.reference ?? jni$_.jNullReference;
+    final _$object9 = object9?.reference ?? jni$_.jNullReference;
+    return _of$10(
+            _class.reference.pointer,
+            _id_of$10 as jni$_.JMethodIDPtr,
+            _$object.pointer,
+            _$object1.pointer,
+            _$object2.pointer,
+            _$object3.pointer,
+            _$object4.pointer,
+            _$object5.pointer,
+            _$object6.pointer,
+            _$object7.pointer,
+            _$object8.pointer,
+            _$object9.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_of$11 = _class.staticMethodId(
+    r'of',
+    r'([Ljava/lang/Object;)Ljava/util/List;',
+  );
+
+  static final _of$11 = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> of(E[] objects)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? of$11<$E extends jni$_.JObject?>(
+    jni$_.JArray<$E?>? objects,
+  ) {
+    final _$objects = objects?.reference ?? jni$_.jNullReference;
+    return _of$11(_class.reference.pointer, _id_of$11 as jni$_.JMethodIDPtr,
+            _$objects.pointer)
+        .object<List<$E?>?>();
+  }
+
+  static final _id_copyOf = _class.staticMethodId(
+    r'copyOf',
+    r'(Ljava/util/Collection;)Ljava/util/List;',
+  );
+
+  static final _copyOf = jni$_.ProtectedJniExtensions.lookup<
+              jni$_.NativeFunction<
+                  jni$_.JniResult Function(
+                      jni$_.Pointer<jni$_.Void>,
+                      jni$_.JMethodIDPtr,
+                      jni$_.VarArgs<(jni$_.Pointer<jni$_.Void>,)>)>>(
+          'globalEnv_CallStaticObjectMethod')
+      .asFunction<
+          jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
+              jni$_.JMethodIDPtr, jni$_.Pointer<jni$_.Void>)>();
+
+  /// from: `static public java.util.List<E> copyOf(java.util.Collection<? extends E> collection)`
+  /// The returned object must be released after use, by calling the [release] method.
+  static List<$E?>? copyOf<$E extends jni$_.JObject?>(
+    jni$_.JObject? collection,
+  ) {
+    final _$collection = collection?.reference ?? jni$_.jNullReference;
+    return _copyOf(_class.reference.pointer, _id_copyOf as jni$_.JMethodIDPtr,
+            _$collection.pointer)
+        .object<List<$E?>?>();
+  }
+
+  /// Maps a specific port to the implemented interface.
+  static final core$_.Map<int, $List> _$impls = {};
+  static jni$_.JObjectPtr _$invoke(
+    int port,
+    jni$_.JObjectPtr descriptor,
+    jni$_.JObjectPtr args,
+  ) {
+    return _$invokeMethod(
+      port,
+      jni$_.MethodInvocation.fromAddresses(
+        0,
+        descriptor.address,
+        args.address,
+      ),
+    );
+  }
+
+  static final jni$_.Pointer<
+          jni$_.NativeFunction<
+              jni$_.JObjectPtr Function(
+                  jni$_.Int64, jni$_.JObjectPtr, jni$_.JObjectPtr)>>
+      _$invokePointer = jni$_.Pointer.fromFunction(_$invoke);
+
+  static jni$_.Pointer<jni$_.Void> _$invokeMethod(
+    int $p,
+    jni$_.MethodInvocation $i,
+  ) {
+    try {
+      final $d = $i.methodDescriptor.toDartString(releaseOriginal: true);
+      final $a = $i.args;
+      if ($d == r'size()I') {
+        final $r = _$impls[$p]!.size();
+        return jni$_.JInteger($r).reference.toPointer();
+      }
+      if ($d == r'isEmpty()Z') {
+        final $r = _$impls[$p]!.isEmpty();
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'contains(Ljava/lang/Object;)Z') {
+        final $r = _$impls[$p]!.contains(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'iterator()Ljava/util/Iterator;') {
+        final $r = _$impls[$p]!.iterator();
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'toArray()[Ljava/lang/Object;') {
+        final $r = _$impls[$p]!.toArray();
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'toArray([Ljava/lang/Object;)[Ljava/lang/Object;') {
+        final $r = _$impls[$p]!.toArray$1(
+          $a![0],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'add(Ljava/lang/Object;)Z') {
+        final $r = _$impls[$p]!.add(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'remove(Ljava/lang/Object;)Z') {
+        final $r = _$impls[$p]!.remove(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'containsAll(Ljava/util/Collection;)Z') {
+        final $r = _$impls[$p]!.containsAll(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'addAll(Ljava/util/Collection;)Z') {
+        final $r = _$impls[$p]!.addAll(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'addAll(ILjava/util/Collection;)Z') {
+        final $r = _$impls[$p]!.addAll$1(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+          $a![1],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'removeAll(Ljava/util/Collection;)Z') {
+        final $r = _$impls[$p]!.removeAll(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'retainAll(Ljava/util/Collection;)Z') {
+        final $r = _$impls[$p]!.retainAll(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'replaceAll(Ljava/util/function/UnaryOperator;)V') {
+        _$impls[$p]!.replaceAll(
+          $a![0],
+        );
+        return jni$_.nullptr;
+      }
+      if ($d == r'sort(Ljava/util/Comparator;)V') {
+        _$impls[$p]!.sort(
+          $a![0],
+        );
+        return jni$_.nullptr;
+      }
+      if ($d == r'clear()V') {
+        _$impls[$p]!.clear();
+        return jni$_.nullptr;
+      }
+      if ($d == r'equals(Ljava/lang/Object;)Z') {
+        final $r = _$impls[$p]!.equals(
+          $a![0],
+        );
+        return jni$_.JBoolean($r).reference.toPointer();
+      }
+      if ($d == r'hashCode()I') {
+        final $r = _$impls[$p]!.hashCode$1();
+        return jni$_.JInteger($r).reference.toPointer();
+      }
+      if ($d == r'get(I)Ljava/lang/Object;') {
+        final $r = _$impls[$p]!.get(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'set(ILjava/lang/Object;)Ljava/lang/Object;') {
+        final $r = _$impls[$p]!.set(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+          $a![1],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'add(ILjava/lang/Object;)V') {
+        _$impls[$p]!.add$1(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+          $a![1],
+        );
+        return jni$_.nullptr;
+      }
+      if ($d == r'remove(I)Ljava/lang/Object;') {
+        final $r = _$impls[$p]!.remove$1(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'indexOf(Ljava/lang/Object;)I') {
+        final $r = _$impls[$p]!.indexOf(
+          $a![0],
+        );
+        return jni$_.JInteger($r).reference.toPointer();
+      }
+      if ($d == r'lastIndexOf(Ljava/lang/Object;)I') {
+        final $r = _$impls[$p]!.lastIndexOf(
+          $a![0],
+        );
+        return jni$_.JInteger($r).reference.toPointer();
+      }
+      if ($d == r'listIterator()Ljava/util/ListIterator;') {
+        final $r = _$impls[$p]!.listIterator();
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'listIterator(I)Ljava/util/ListIterator;') {
+        final $r = _$impls[$p]!.listIterator$1(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'subList(II)Ljava/util/List;') {
+        final $r = _$impls[$p]!.subList(
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+          ($a![1] as jni$_.JInteger).intValue(releaseOriginal: true),
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'spliterator()Ljava/util/Spliterator;') {
+        final $r = _$impls[$p]!.spliterator();
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'of()Ljava/util/List;') {
+        final $r = _$impls[$p]!.of();
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'of(Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$1(
+          $a![0],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$2(
+          $a![0],
+          $a![1],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$3(
+          $a![0],
+          $a![1],
+          $a![2],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$4(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$5(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+          $a![4],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$6(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+          $a![4],
+          $a![5],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$7(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+          $a![4],
+          $a![5],
+          $a![6],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$8(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+          $a![4],
+          $a![5],
+          $a![6],
+          $a![7],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$9(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+          $a![4],
+          $a![5],
+          $a![6],
+          $a![7],
+          $a![8],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d ==
+          r'of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$10(
+          $a![0],
+          $a![1],
+          $a![2],
+          $a![3],
+          $a![4],
+          $a![5],
+          $a![6],
+          $a![7],
+          $a![8],
+          $a![9],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'of([Ljava/lang/Object;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.of$11(
+          $a![0],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+      if ($d == r'copyOf(Ljava/util/Collection;)Ljava/util/List;') {
+        final $r = _$impls[$p]!.copyOf(
+          $a![0],
+        );
+        return ($r as jni$_.JObject?)
+                ?.as(const jni$_.$JObject$Type$())
+                .reference
+                .toPointer() ??
+            jni$_.nullptr;
+      }
+    } catch (e) {
+      return jni$_.ProtectedJniExtensions.newDartException(e);
+    }
+    return jni$_.nullptr;
+  }
+
+  static void implementIn<$E extends jni$_.JObject?>(
+    jni$_.JImplementer implementer,
+    $List<$E> $impl,
+  ) {
+    late final jni$_.RawReceivePort $p;
+    $p = jni$_.RawReceivePort(($m) {
+      if ($m == null) {
+        _$impls.remove($p.sendPort.nativePort);
+        $p.close();
+        return;
+      }
+      final $i = jni$_.MethodInvocation.fromMessage($m);
+      final $r = _$invokeMethod($p.sendPort.nativePort, $i);
+      jni$_.ProtectedJniExtensions.returnResult($i.result, $r);
+    });
+    implementer.add(
+      r'java.util.List',
+      $p,
+      _$invokePointer,
+      [
+        if ($impl.replaceAll$async)
+          r'replaceAll(Ljava/util/function/UnaryOperator;)V',
+        if ($impl.sort$async) r'sort(Ljava/util/Comparator;)V',
+        if ($impl.clear$async) r'clear()V',
+        if ($impl.add$1$async) r'add(ILjava/lang/Object;)V',
+      ],
+    );
+    final $a = $p.sendPort.nativePort;
+    _$impls[$a] = $impl;
+  }
+
+  factory List.implement(
+    $List<$E> $impl,
+  ) {
+    final $i = jni$_.JImplementer();
+    implementIn($i, $impl);
+    return $i.implement<List<$E>>();
+  }
+}
+
+abstract base mixin class $List<$E extends jni$_.JObject?> {
+  factory $List({
+    required int Function() size,
+    required bool Function() isEmpty,
+    required bool Function(jni$_.JObject? object) contains,
+    required iterator$_.Iterator<jni$_.JObject?>? Function() iterator,
+    required jni$_.JArray<jni$_.JObject?>? Function() toArray,
+    required jni$_.JArray<jni$_.JObject?>? Function(
+            jni$_.JArray<jni$_.JObject?>? objects)
+        toArray$1,
+    required bool Function($E? object) add,
+    required bool Function(jni$_.JObject? object) remove,
+    required bool Function(jni$_.JObject? collection) containsAll,
+    required bool Function(jni$_.JObject? collection) addAll,
+    required bool Function(int i, jni$_.JObject? collection) addAll$1,
+    required bool Function(jni$_.JObject? collection) removeAll,
+    required bool Function(jni$_.JObject? collection) retainAll,
+    required void Function(jni$_.JObject? unaryOperator) replaceAll,
+    bool replaceAll$async,
+    required void Function(jni$_.JObject? comparator) sort,
+    bool sort$async,
+    required void Function() clear,
+    bool clear$async,
+    required bool Function(jni$_.JObject? object) equals,
+    required int Function() hashCode$1,
+    required $E? Function(int i) get,
+    required $E? Function(int i, $E? object) set,
+    required void Function(int i, $E? object) add$1,
+    bool add$1$async,
+    required $E? Function(int i) remove$1,
+    required int Function(jni$_.JObject? object) indexOf,
+    required int Function(jni$_.JObject? object) lastIndexOf,
+    required jni$_.JObject? Function() listIterator,
+    required jni$_.JObject? Function(int i) listIterator$1,
+    required List<jni$_.JObject?>? Function(int i, int i1) subList,
+    required jni$_.JObject? Function() spliterator,
+    required List<jni$_.JObject?>? Function() of,
+    required List<jni$_.JObject?>? Function(jni$_.JObject? object) of$1,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object, jni$_.JObject? object1)
+        of$2,
+    required List<jni$_.JObject?>? Function(jni$_.JObject? object,
+            jni$_.JObject? object1, jni$_.JObject? object2)
+        of$3,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3)
+        of$4,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4)
+        of$5,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5)
+        of$6,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6)
+        of$7,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6,
+            jni$_.JObject? object7)
+        of$8,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6,
+            jni$_.JObject? object7,
+            jni$_.JObject? object8)
+        of$9,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6,
+            jni$_.JObject? object7,
+            jni$_.JObject? object8,
+            jni$_.JObject? object9)
+        of$10,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JArray<jni$_.JObject?>? objects)
+        of$11,
+    required List<jni$_.JObject?>? Function(jni$_.JObject? collection) copyOf,
+  }) = _$List<$E>;
+
+  int size();
+  bool isEmpty();
+  bool contains(jni$_.JObject? object);
+  iterator$_.Iterator<jni$_.JObject?>? iterator();
+  jni$_.JArray<jni$_.JObject?>? toArray();
+  jni$_.JArray<jni$_.JObject?>? toArray$1(
+      jni$_.JArray<jni$_.JObject?>? objects);
+  bool add($E? object);
+  bool remove(jni$_.JObject? object);
+  bool containsAll(jni$_.JObject? collection);
+  bool addAll(jni$_.JObject? collection);
+  bool addAll$1(int i, jni$_.JObject? collection);
+  bool removeAll(jni$_.JObject? collection);
+  bool retainAll(jni$_.JObject? collection);
+  void replaceAll(jni$_.JObject? unaryOperator);
+  bool get replaceAll$async => false;
+  void sort(jni$_.JObject? comparator);
+  bool get sort$async => false;
+  void clear();
+  bool get clear$async => false;
+  bool equals(jni$_.JObject? object);
+  int hashCode$1();
+  $E? get(int i);
+  $E? set(int i, $E? object);
+  void add$1(int i, $E? object);
+  bool get add$1$async => false;
+  $E? remove$1(int i);
+  int indexOf(jni$_.JObject? object);
+  int lastIndexOf(jni$_.JObject? object);
+  jni$_.JObject? listIterator();
+  jni$_.JObject? listIterator$1(int i);
+  List<jni$_.JObject?>? subList(int i, int i1);
+  jni$_.JObject? spliterator();
+  List<jni$_.JObject?>? of();
+  List<jni$_.JObject?>? of$1(jni$_.JObject? object);
+  List<jni$_.JObject?>? of$2(jni$_.JObject? object, jni$_.JObject? object1);
+  List<jni$_.JObject?>? of$3(
+      jni$_.JObject? object, jni$_.JObject? object1, jni$_.JObject? object2);
+  List<jni$_.JObject?>? of$4(jni$_.JObject? object, jni$_.JObject? object1,
+      jni$_.JObject? object2, jni$_.JObject? object3);
+  List<jni$_.JObject?>? of$5(jni$_.JObject? object, jni$_.JObject? object1,
+      jni$_.JObject? object2, jni$_.JObject? object3, jni$_.JObject? object4);
+  List<jni$_.JObject?>? of$6(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5);
+  List<jni$_.JObject?>? of$7(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6);
+  List<jni$_.JObject?>? of$8(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7);
+  List<jni$_.JObject?>? of$9(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7,
+      jni$_.JObject? object8);
+  List<jni$_.JObject?>? of$10(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7,
+      jni$_.JObject? object8,
+      jni$_.JObject? object9);
+  List<jni$_.JObject?>? of$11(jni$_.JArray<jni$_.JObject?>? objects);
+  List<jni$_.JObject?>? copyOf(jni$_.JObject? collection);
+}
+
+final class _$List<$E extends jni$_.JObject?> with $List<$E> {
+  _$List({
+    required int Function() size,
+    required bool Function() isEmpty,
+    required bool Function(jni$_.JObject? object) contains,
+    required iterator$_.Iterator<jni$_.JObject?>? Function() iterator,
+    required jni$_.JArray<jni$_.JObject?>? Function() toArray,
+    required jni$_.JArray<jni$_.JObject?>? Function(
+            jni$_.JArray<jni$_.JObject?>? objects)
+        toArray$1,
+    required bool Function($E? object) add,
+    required bool Function(jni$_.JObject? object) remove,
+    required bool Function(jni$_.JObject? collection) containsAll,
+    required bool Function(jni$_.JObject? collection) addAll,
+    required bool Function(int i, jni$_.JObject? collection) addAll$1,
+    required bool Function(jni$_.JObject? collection) removeAll,
+    required bool Function(jni$_.JObject? collection) retainAll,
+    required void Function(jni$_.JObject? unaryOperator) replaceAll,
+    this.replaceAll$async = false,
+    required void Function(jni$_.JObject? comparator) sort,
+    this.sort$async = false,
+    required void Function() clear,
+    this.clear$async = false,
+    required bool Function(jni$_.JObject? object) equals,
+    required int Function() hashCode$1,
+    required $E? Function(int i) get,
+    required $E? Function(int i, $E? object) set,
+    required void Function(int i, $E? object) add$1,
+    this.add$1$async = false,
+    required $E? Function(int i) remove$1,
+    required int Function(jni$_.JObject? object) indexOf,
+    required int Function(jni$_.JObject? object) lastIndexOf,
+    required jni$_.JObject? Function() listIterator,
+    required jni$_.JObject? Function(int i) listIterator$1,
+    required List<jni$_.JObject?>? Function(int i, int i1) subList,
+    required jni$_.JObject? Function() spliterator,
+    required List<jni$_.JObject?>? Function() of,
+    required List<jni$_.JObject?>? Function(jni$_.JObject? object) of$1,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object, jni$_.JObject? object1)
+        of$2,
+    required List<jni$_.JObject?>? Function(jni$_.JObject? object,
+            jni$_.JObject? object1, jni$_.JObject? object2)
+        of$3,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3)
+        of$4,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4)
+        of$5,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5)
+        of$6,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6)
+        of$7,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6,
+            jni$_.JObject? object7)
+        of$8,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6,
+            jni$_.JObject? object7,
+            jni$_.JObject? object8)
+        of$9,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JObject? object,
+            jni$_.JObject? object1,
+            jni$_.JObject? object2,
+            jni$_.JObject? object3,
+            jni$_.JObject? object4,
+            jni$_.JObject? object5,
+            jni$_.JObject? object6,
+            jni$_.JObject? object7,
+            jni$_.JObject? object8,
+            jni$_.JObject? object9)
+        of$10,
+    required List<jni$_.JObject?>? Function(
+            jni$_.JArray<jni$_.JObject?>? objects)
+        of$11,
+    required List<jni$_.JObject?>? Function(jni$_.JObject? collection) copyOf,
+  })  : _size = size,
+        _isEmpty = isEmpty,
+        _contains = contains,
+        _iterator = iterator,
+        _toArray = toArray,
+        _toArray$1 = toArray$1,
+        _add = add,
+        _remove = remove,
+        _containsAll = containsAll,
+        _addAll = addAll,
+        _addAll$1 = addAll$1,
+        _removeAll = removeAll,
+        _retainAll = retainAll,
+        _replaceAll = replaceAll,
+        _sort = sort,
+        _clear = clear,
+        _equals = equals,
+        _hashCode$1 = hashCode$1,
+        _get = get,
+        _set = set,
+        _add$1 = add$1,
+        _remove$1 = remove$1,
+        _indexOf = indexOf,
+        _lastIndexOf = lastIndexOf,
+        _listIterator = listIterator,
+        _listIterator$1 = listIterator$1,
+        _subList = subList,
+        _spliterator = spliterator,
+        _of = of,
+        _of$1 = of$1,
+        _of$2 = of$2,
+        _of$3 = of$3,
+        _of$4 = of$4,
+        _of$5 = of$5,
+        _of$6 = of$6,
+        _of$7 = of$7,
+        _of$8 = of$8,
+        _of$9 = of$9,
+        _of$10 = of$10,
+        _of$11 = of$11,
+        _copyOf = copyOf;
+
+  final int Function() _size;
+  final bool Function() _isEmpty;
+  final bool Function(jni$_.JObject? object) _contains;
+  final iterator$_.Iterator<jni$_.JObject?>? Function() _iterator;
+  final jni$_.JArray<jni$_.JObject?>? Function() _toArray;
+  final jni$_.JArray<jni$_.JObject?>? Function(
+      jni$_.JArray<jni$_.JObject?>? objects) _toArray$1;
+  final bool Function($E? object) _add;
+  final bool Function(jni$_.JObject? object) _remove;
+  final bool Function(jni$_.JObject? collection) _containsAll;
+  final bool Function(jni$_.JObject? collection) _addAll;
+  final bool Function(int i, jni$_.JObject? collection) _addAll$1;
+  final bool Function(jni$_.JObject? collection) _removeAll;
+  final bool Function(jni$_.JObject? collection) _retainAll;
+  final void Function(jni$_.JObject? unaryOperator) _replaceAll;
+  final bool replaceAll$async;
+  final void Function(jni$_.JObject? comparator) _sort;
+  final bool sort$async;
+  final void Function() _clear;
+  final bool clear$async;
+  final bool Function(jni$_.JObject? object) _equals;
+  final int Function() _hashCode$1;
+  final $E? Function(int i) _get;
+  final $E? Function(int i, $E? object) _set;
+  final void Function(int i, $E? object) _add$1;
+  final bool add$1$async;
+  final $E? Function(int i) _remove$1;
+  final int Function(jni$_.JObject? object) _indexOf;
+  final int Function(jni$_.JObject? object) _lastIndexOf;
+  final jni$_.JObject? Function() _listIterator;
+  final jni$_.JObject? Function(int i) _listIterator$1;
+  final List<jni$_.JObject?>? Function(int i, int i1) _subList;
+  final jni$_.JObject? Function() _spliterator;
+  final List<jni$_.JObject?>? Function() _of;
+  final List<jni$_.JObject?>? Function(jni$_.JObject? object) _of$1;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object, jni$_.JObject? object1) _of$2;
+  final List<jni$_.JObject?>? Function(
+          jni$_.JObject? object, jni$_.JObject? object1, jni$_.JObject? object2)
+      _of$3;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3) _of$4;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4) _of$5;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5) _of$6;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6) _of$7;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7) _of$8;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7,
+      jni$_.JObject? object8) _of$9;
+  final List<jni$_.JObject?>? Function(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7,
+      jni$_.JObject? object8,
+      jni$_.JObject? object9) _of$10;
+  final List<jni$_.JObject?>? Function(jni$_.JArray<jni$_.JObject?>? objects)
+      _of$11;
+  final List<jni$_.JObject?>? Function(jni$_.JObject? collection) _copyOf;
+
+  int size() {
+    return _size();
+  }
+
+  bool isEmpty() {
+    return _isEmpty();
+  }
+
+  bool contains(jni$_.JObject? object) {
+    return _contains(object);
+  }
+
+  iterator$_.Iterator<jni$_.JObject?>? iterator() {
+    return _iterator();
+  }
+
+  jni$_.JArray<jni$_.JObject?>? toArray() {
+    return _toArray();
+  }
+
+  jni$_.JArray<jni$_.JObject?>? toArray$1(
+      jni$_.JArray<jni$_.JObject?>? objects) {
+    return _toArray$1(objects);
+  }
+
+  bool add($E? object) {
+    return _add(object);
+  }
+
+  bool remove(jni$_.JObject? object) {
+    return _remove(object);
+  }
+
+  bool containsAll(jni$_.JObject? collection) {
+    return _containsAll(collection);
+  }
+
+  bool addAll(jni$_.JObject? collection) {
+    return _addAll(collection);
+  }
+
+  bool addAll$1(int i, jni$_.JObject? collection) {
+    return _addAll$1(i, collection);
+  }
+
+  bool removeAll(jni$_.JObject? collection) {
+    return _removeAll(collection);
+  }
+
+  bool retainAll(jni$_.JObject? collection) {
+    return _retainAll(collection);
+  }
+
+  void replaceAll(jni$_.JObject? unaryOperator) {
+    return _replaceAll(unaryOperator);
+  }
+
+  void sort(jni$_.JObject? comparator) {
+    return _sort(comparator);
+  }
+
+  void clear() {
+    return _clear();
+  }
+
+  bool equals(jni$_.JObject? object) {
+    return _equals(object);
+  }
+
+  int hashCode$1() {
+    return _hashCode$1();
+  }
+
+  $E? get(int i) {
+    return _get(i);
+  }
+
+  $E? set(int i, $E? object) {
+    return _set(i, object);
+  }
+
+  void add$1(int i, $E? object) {
+    return _add$1(i, object);
+  }
+
+  $E? remove$1(int i) {
+    return _remove$1(i);
+  }
+
+  int indexOf(jni$_.JObject? object) {
+    return _indexOf(object);
+  }
+
+  int lastIndexOf(jni$_.JObject? object) {
+    return _lastIndexOf(object);
+  }
+
+  jni$_.JObject? listIterator() {
+    return _listIterator();
+  }
+
+  jni$_.JObject? listIterator$1(int i) {
+    return _listIterator$1(i);
+  }
+
+  List<jni$_.JObject?>? subList(int i, int i1) {
+    return _subList(i, i1);
+  }
+
+  jni$_.JObject? spliterator() {
+    return _spliterator();
+  }
+
+  List<jni$_.JObject?>? of() {
+    return _of();
+  }
+
+  List<jni$_.JObject?>? of$1(jni$_.JObject? object) {
+    return _of$1(object);
+  }
+
+  List<jni$_.JObject?>? of$2(jni$_.JObject? object, jni$_.JObject? object1) {
+    return _of$2(object, object1);
+  }
+
+  List<jni$_.JObject?>? of$3(
+      jni$_.JObject? object, jni$_.JObject? object1, jni$_.JObject? object2) {
+    return _of$3(object, object1, object2);
+  }
+
+  List<jni$_.JObject?>? of$4(jni$_.JObject? object, jni$_.JObject? object1,
+      jni$_.JObject? object2, jni$_.JObject? object3) {
+    return _of$4(object, object1, object2, object3);
+  }
+
+  List<jni$_.JObject?>? of$5(jni$_.JObject? object, jni$_.JObject? object1,
+      jni$_.JObject? object2, jni$_.JObject? object3, jni$_.JObject? object4) {
+    return _of$5(object, object1, object2, object3, object4);
+  }
+
+  List<jni$_.JObject?>? of$6(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5) {
+    return _of$6(object, object1, object2, object3, object4, object5);
+  }
+
+  List<jni$_.JObject?>? of$7(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6) {
+    return _of$7(object, object1, object2, object3, object4, object5, object6);
+  }
+
+  List<jni$_.JObject?>? of$8(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7) {
+    return _of$8(
+        object, object1, object2, object3, object4, object5, object6, object7);
+  }
+
+  List<jni$_.JObject?>? of$9(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7,
+      jni$_.JObject? object8) {
+    return _of$9(object, object1, object2, object3, object4, object5, object6,
+        object7, object8);
+  }
+
+  List<jni$_.JObject?>? of$10(
+      jni$_.JObject? object,
+      jni$_.JObject? object1,
+      jni$_.JObject? object2,
+      jni$_.JObject? object3,
+      jni$_.JObject? object4,
+      jni$_.JObject? object5,
+      jni$_.JObject? object6,
+      jni$_.JObject? object7,
+      jni$_.JObject? object8,
+      jni$_.JObject? object9) {
+    return _of$10(object, object1, object2, object3, object4, object5, object6,
+        object7, object8, object9);
+  }
+
+  List<jni$_.JObject?>? of$11(jni$_.JArray<jni$_.JObject?>? objects) {
+    return _of$11(objects);
+  }
+
+  List<jni$_.JObject?>? copyOf(jni$_.JObject? collection) {
+    return _copyOf(collection);
+  }
+}
+
+final class $List$Type$ extends jni$_.JType<List> {
+  @jni$_.internal
+  const $List$Type$();
+
+  @jni$_.internal
+  @core$_.override
+  String get signature => r'Ljava/util/List;';
+}
diff --git a/pkgs/jni/lib/core_bindings/java/util/_package.dart b/pkgs/jni/lib/core_bindings/java/util/_package.dart
new file mode 100644
index 0000000..78ce06b
--- /dev/null
+++ b/pkgs/jni/lib/core_bindings/java/util/_package.dart
@@ -0,0 +1,3 @@
+// AUTO GENERATED BY JNIGEN 0.15.0. DO NOT EDIT!
+export 'List.dart';
+export 'Iterator.dart';
diff --git a/pkgs/jni/lib/jni.dart b/pkgs/jni/lib/jni.dart
index 49ce91d..da01295 100644
--- a/pkgs/jni/lib/jni.dart
+++ b/pkgs/jni/lib/jni.dart
@@ -66,7 +66,7 @@
 export 'src/jarray.dart'
     hide
         $JArray$NullableType$,
-        $JArray$Type$,
+        _$JArray$Type$,
         $JBooleanArray$NullableType$,
         $JBooleanArray$Type$,
         $JByteArray$NullableType$,
diff --git a/pkgs/jni/lib/src/accessors.dart b/pkgs/jni/lib/src/accessors.dart
index 704caac..7584f7d 100644
--- a/pkgs/jni/lib/src/accessors.dart
+++ b/pkgs/jni/lib/src/accessors.dart
@@ -10,7 +10,6 @@
 import 'jobject.dart';
 import 'jreference.dart';
 import 'third_party/generated_bindings.dart';
-import 'types.dart';
 
 void _check(JThrowablePtr exception) {
   if (exception != nullptr) {
@@ -72,8 +71,8 @@
     return pointer == nullptr ? jNullReference : JGlobalReference(pointer);
   }
 
-  T object<T extends JObject?>(JType<T> type) {
-    return type.fromReference(reference);
+  T object<T extends JObject?>() {
+    return JObject.fromReference(reference) as T;
   }
 
   bool get boolean {
diff --git a/pkgs/jni/lib/src/jarray.dart b/pkgs/jni/lib/src/jarray.dart
index f614d9b..1f82def 100644
--- a/pkgs/jni/lib/src/jarray.dart
+++ b/pkgs/jni/lib/src/jarray.dart
@@ -2,139 +2,51 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore_for_file: unnecessary_cast, overridden_fields
-
+import 'dart:collection';
 import 'dart:ffi';
 import 'dart:typed_data';
 
+import 'package:collection/collection.dart';
 import 'package:ffi/ffi.dart';
-import 'package:meta/meta.dart' show internal;
 
 import 'jni.dart';
 import 'jobject.dart';
 import 'jreference.dart';
-import 'third_party/generated_bindings.dart';
 import 'types.dart';
 
-@internal
-final class $JArray$NullableType$<E extends JObject?>
-    extends JType<JArray<E>?> {
+part 'primitive_jarrays.dart';
+
+final class _$JArray$Type$<E extends JObject?> extends JType<JArray<E>> {
   final JType<E> elementType;
 
-  const $JArray$NullableType$(this.elementType);
-
-  @override
-  String get signature => '[${elementType.signature}';
-
-  @override
-  JArray<E>? fromReference(JReference reference) =>
-      reference.isNull ? null : JArray<E>.fromReference(elementType, reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JArray<E>?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => Object.hash($JArray$NullableType$, elementType);
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JArray$NullableType$<E>) &&
-        other is $JArray$NullableType$<E> &&
-        elementType == other.elementType;
-  }
+  _$JArray$Type$(this.elementType) : super('[${elementType.signature}');
 }
 
-@internal
-final class $JArray$Type$<E extends JObject?> extends JType<JArray<E>> {
-  final JType<E> elementType;
-
-  const $JArray$Type$(this.elementType);
-
-  @override
-  String get signature => '[${elementType.signature}';
-
-  @override
-  JArray<E> fromReference(JReference reference) =>
-      JArray<E>.fromReference(elementType, reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JArray<E>?> get nullableType => $JArray$NullableType$<E>(elementType);
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => Object.hash($JArray$Type$, elementType);
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JArray$Type$<E>) &&
-        other is $JArray$Type$<E> &&
-        elementType == other.elementType;
-  }
-}
-
-class JArray<E extends JObject?> extends JObject with Iterable<E> {
-  final JType<E> elementType;
-
-  @internal
-  @override
-  final JType<JArray<E>> $type;
-
+extension type JArray<E extends JObject?>._(JObject _$this) implements JObject {
   /// The type which includes information such as the signature of this class.
   static JType<JArray<E>> type<E extends JObject?>(JType<E> innerType) =>
-      $JArray$Type$<E>(innerType);
-
-  /// The type which includes information such as the signature of this class.
-  static JType<JArray<E>?> nullableType<E extends JObject?>(
-          JType<E> innerType) =>
-      $JArray$NullableType$<E>(innerType);
-
-  /// Construct a new [JArray] with [reference] as its underlying reference.
-  JArray.fromReference(this.elementType, JReference reference)
-      : $type = type<E>(elementType),
-        super.fromReference(reference);
+      _$JArray$Type$<E>(innerType);
 
   /// Creates a [JArray] of the given length from the given [elementType].
   ///
   /// The [length] must be a non-negative integer.
-  /// For objects, [elementType] must be a nullable type as this constructor
-  /// initializes all elements with `null`.
-  factory JArray(JType<E> elementType, int length) {
+  static JArray<E?> withLength<E extends JObject?>(
+      JType<E> elementType, int length) {
     RangeError.checkNotNegative(length);
-    if (!elementType.isNullable) {
-      throw ArgumentError.value(
-          elementType,
-          'elementType',
-          'Element type of JArray must be nullable when constructed with a '
-              'length (because the elements will be initialized to null).\n\n'
-              'Try using .nullableType instead');
-    }
-    return _newArray<E>(elementType, length);
+    return _newArray<E>(elementType.jClass, length);
   }
 
-  static JArray<$E> _newArray<$E extends JObject?>(
-      JType<$E> elementType, int length,
+  static JArray<$E> _newArray<$E extends JObject?>(JClass jClass, int length,
       [$E? fill]) {
-    final classRef = elementType.jClass.reference;
+    final classRef = jClass.reference;
     final fillRef = fill?.reference ?? jNullReference;
-    final array = JArray<$E>.fromReference(
-      elementType,
+    final array = JObject.fromReference(
       JGlobalReference(Jni.env.NewObjectArray(
         length,
         classRef.pointer,
         fillRef.pointer,
       )),
-    );
+    ) as JArray<$E>;
     classRef.release();
     return array;
   }
@@ -143,35 +55,33 @@
   ///
   /// The [length] must be a non-negative integer.
   static JArray<$E> filled<$E extends JObject>(int length, $E fill,
-      {JType<$E>? E}) {
+      {JType<$E>? elementType}) {
     RangeError.checkNotNegative(length);
-    E ??= fill.$type as JType<$E>;
-    return _newArray<$E>(E, length, fill);
+    final jClass = elementType == null ? fill.jClass : elementType.jClass;
+    return _newArray<$E>(jClass, length, fill);
   }
 
   /// Creates a [JArray] from `elements`.
   static JArray<$E> of<$E extends JObject?>(
       JType<$E> elementType, Iterable<$E> elements) {
-    return _newArray<$E>(elementType, elements.length)
+    return _newArray<$E>(elementType.jClass, elements.length)
       ..setRange(0, elements.length, elements);
   }
 
   /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
+  int get length => Jni.env.GetArrayLength(reference.pointer);
 
-  @override
-  E elementAt(int index) {
+  E _elementAt(int index) {
     RangeError.checkValidIndex(index, this);
     final pointer = Jni.env.GetObjectArrayElement(reference.pointer, index);
     if (pointer == nullptr) {
       return null as E;
     }
-    return (elementType as JType<E>).fromReference(JGlobalReference(pointer));
+    return JObject.fromReference(JGlobalReference(pointer)) as E;
   }
 
   E operator [](int index) {
-    return elementAt(index);
+    return _elementAt(index);
   }
 
   void operator []=(int index, E value) {
@@ -188,40 +98,33 @@
       this[index] = element;
     }
   }
-
-  @override
-  Iterator<E> get iterator => _JArrayIterator(this);
 }
 
-class _JArrayIterator<E> implements Iterator<E> {
-  final Iterable<E> _iterable;
-  final int _length;
-  int _index;
-  E? _current;
+final class _JArrayListView<E extends JObject?>
+    with ListMixin<E>, NonGrowableListMixin<E> {
+  final JArray<E> _jarray;
 
-  _JArrayIterator(Iterable<E> iterable)
-      : _iterable = iterable,
-        _length = iterable.length,
-        _index = 0;
+  _JArrayListView(this._jarray);
 
   @override
-  E get current => _current as E;
+  int get length => _jarray.length;
 
   @override
-  @pragma('vm:prefer-inline')
-  bool moveNext() {
-    final length = _iterable.length;
-    if (_length != length) {
-      throw ConcurrentModificationError(_iterable);
-    }
-    if (_index >= length) {
-      _current = null;
-      return false;
-    }
-    _current = _iterable.elementAt(_index);
-    _index++;
-    return true;
+  E operator [](int index) {
+    return _jarray[index];
   }
+
+  @override
+  void operator []=(int index, E value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JArrayToList<E extends JObject?> on JArray<E> {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<E> get asDartList => _JArrayListView<E>(this);
 }
 
 void _allocate<T extends NativeType>(
@@ -243,1057 +146,3 @@
     };
   }
 }
-
-@internal
-final class $JBooleanArray$NullableType$ extends JType<JBooleanArray?> {
-  const $JBooleanArray$NullableType$();
-
-  @override
-  String get signature => '[Z';
-
-  @override
-  JBooleanArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JBooleanArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JBooleanArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JBooleanArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JBooleanArray$NullableType$ &&
-        other is $JBooleanArray$NullableType$;
-  }
-}
-
-@internal
-final class $JBooleanArray$Type$ extends JType<JBooleanArray> {
-  const $JBooleanArray$Type$();
-
-  @override
-  String get signature => '[Z';
-
-  @override
-  JBooleanArray fromReference(JReference reference) =>
-      JBooleanArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JBooleanArray?> get nullableType =>
-      const $JBooleanArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JBooleanArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JBooleanArray$Type$ &&
-        other is $JBooleanArray$Type$;
-  }
-}
-
-class JBooleanArray extends JObject with Iterable<bool> {
-  @internal
-  @override
-  final JType<JBooleanArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JBooleanArray> type = $JBooleanArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JBooleanArray?> nullableType =
-      $JBooleanArray$NullableType$();
-
-  /// Construct a new [JBooleanArray] with [reference] as its underlying
-  /// reference.
-  JBooleanArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JBooleanArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JBooleanArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JBooleanArray.fromReference(
-      JGlobalReference(Jni.env.NewBooleanArray(length)),
-    );
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  bool elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetBooleanArrayElement(reference.pointer, index);
-  }
-
-  bool operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, bool value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetBooleanArrayElement(reference.pointer, index, value);
-  }
-
-  Uint8List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JBooleanMarker>(rangeLength);
-    Jni.env
-        .GetBooleanArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<bool> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JBooleanMarker>(sizeOf<JBooleanMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable.map((e) => e ? 1 : 0), skipCount);
-      Jni.env.SetBooleanArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<bool> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JByteArray$NullableType$ extends JType<JByteArray?> {
-  const $JByteArray$NullableType$();
-
-  @override
-  String get signature => '[B';
-
-  @override
-  JByteArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JByteArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JByteArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JByteArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JByteArray$NullableType$ &&
-        other is $JByteArray$NullableType$;
-  }
-}
-
-@internal
-final class $JByteArray$Type$ extends JType<JByteArray> {
-  const $JByteArray$Type$();
-
-  @override
-  String get signature => '[B';
-
-  @override
-  JByteArray fromReference(JReference reference) =>
-      JByteArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JByteArray?> get nullableType => const $JByteArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JByteArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JByteArray$Type$ && other is $JByteArray$Type$;
-  }
-}
-
-/// A fixed-length array of Java [`Byte`](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Byte.html).
-///
-/// Integers stored in the list are truncated to their low eight bits,
-/// interpreted as a signed 8-bit two's complement integer with values in the
-/// range -128 to +127.
-///
-/// Java equivalent of [Int8List].
-class JByteArray extends JObject with Iterable<int> {
-  @internal
-  @override
-  final JType<JByteArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JByteArray> type = $JByteArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JByteArray?> nullableType = $JByteArray$NullableType$();
-
-  /// Construct a new [JByteArray] with [reference] as its underlying
-  /// reference.
-  JByteArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JByteArray] containing all `elements`.
-  ///
-  /// The [Iterator] of elements provides the order of the elements.
-  ///
-  /// Elements outside of the range -128 to +127 are truncated to their low
-  /// eight bits and interpreted as signed 8-bit two's complement integers.
-  factory JByteArray.from(Iterable<int> elements) {
-    return JByteArray(elements.length)..setRange(0, elements.length, elements);
-  }
-
-  /// Creates a [JByteArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JByteArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JByteArray.fromReference(
-        JGlobalReference(Jni.env.NewByteArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  int elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetByteArrayElement(reference.pointer, index);
-  }
-
-  int operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, int value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetByteArrayElement(reference.pointer, index, value);
-  }
-
-  Int8List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JByteMarker>(rangeLength);
-    Jni.env.GetByteArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<int> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JByteMarker>(sizeOf<JByteMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetByteArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<int> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JCharArray$NullableType$ extends JType<JCharArray?> {
-  const $JCharArray$NullableType$();
-
-  @override
-  String get signature => '[C';
-
-  @override
-  JCharArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JCharArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JCharArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JCharArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JCharArray$NullableType$ &&
-        other is $JCharArray$NullableType$;
-  }
-}
-
-@internal
-final class $JCharArray$Type$ extends JType<JCharArray> {
-  const $JCharArray$Type$();
-
-  @override
-  String get signature => '[C';
-
-  @override
-  JCharArray fromReference(JReference reference) =>
-      JCharArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JCharArray?> get nullableType => const $JCharArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JCharArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JCharArray$Type$ && other is $JCharArray$Type$;
-  }
-}
-
-/// `JCharArray` is a 16-bit integer array.
-///
-/// Due to variable length encoding, the  number of code units is not equal to
-/// the number of characters.
-class JCharArray extends JObject with Iterable<int> {
-  @internal
-  @override
-  final JType<JCharArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JCharArray> type = $JCharArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JCharArray?> nullableType = $JCharArray$NullableType$();
-
-  /// Construct a new [JCharArray] with [reference] as its underlying
-  /// reference.
-  JCharArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JCharArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JCharArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JCharArray.fromReference(
-        JGlobalReference(Jni.env.NewCharArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  int elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetCharArrayElement(reference.pointer, index);
-  }
-
-  int operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, int value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetCharArrayElement(reference.pointer, index, value);
-  }
-
-  Uint16List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JCharMarker>(rangeLength);
-    Jni.env.GetCharArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<int> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JCharMarker>(sizeOf<JCharMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetCharArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<int> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JShortArray$NullableType$ extends JType<JShortArray?> {
-  const $JShortArray$NullableType$();
-
-  @override
-  String get signature => '[S';
-
-  @override
-  JShortArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JShortArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JShortArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JShortArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JShortArray$NullableType$ &&
-        other is $JShortArray$NullableType$;
-  }
-}
-
-@internal
-final class $JShortArray$Type$ extends JType<JShortArray> {
-  const $JShortArray$Type$();
-
-  @override
-  String get signature => '[S';
-
-  @override
-  JShortArray fromReference(JReference reference) =>
-      JShortArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JShortArray?> get nullableType => const $JShortArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JShortArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JShortArray$Type$ &&
-        other is $JShortArray$Type$;
-  }
-}
-
-class JShortArray extends JObject with Iterable<int> {
-  @internal
-  @override
-  final JType<JShortArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JShortArray> type = $JShortArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JShortArray?> nullableType = $JShortArray$NullableType$();
-
-  /// Construct a new [JShortArray] with [reference] as its underlying
-  /// reference.
-  JShortArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JShortArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JShortArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JShortArray.fromReference(
-        JGlobalReference(Jni.env.NewShortArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  int elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetShortArrayElement(reference.pointer, index);
-  }
-
-  int operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, int value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetShortArrayElement(reference.pointer, index, value);
-  }
-
-  Int16List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JShortMarker>(rangeLength);
-    Jni.env.GetShortArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<int> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JShortMarker>(sizeOf<JShortMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetShortArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<int> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JIntArray$NullableType$ extends JType<JIntArray?> {
-  const $JIntArray$NullableType$();
-
-  @override
-  String get signature => '[I';
-
-  @override
-  JIntArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JIntArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JIntArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JIntArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JIntArray$NullableType$ &&
-        other is $JIntArray$NullableType$;
-  }
-}
-
-@internal
-final class $JIntArray$Type$ extends JType<JIntArray> {
-  const $JIntArray$Type$();
-
-  @override
-  String get signature => '[I';
-
-  @override
-  JIntArray fromReference(JReference reference) =>
-      JIntArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JIntArray?> get nullableType => const $JIntArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JIntArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JIntArray$Type$ && other is $JIntArray$Type$;
-  }
-}
-
-class JIntArray extends JObject with Iterable<int> {
-  @internal
-  @override
-  final JType<JIntArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JIntArray> type = $JIntArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JIntArray?> nullableType = $JIntArray$NullableType$();
-
-  /// Construct a new [JIntArray] with [reference] as its underlying
-  /// reference.
-  JIntArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JIntArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JIntArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JIntArray.fromReference(
-        JGlobalReference(Jni.env.NewIntArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  int elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetIntArrayElement(reference.pointer, index);
-  }
-
-  int operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, int value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetIntArrayElement(reference.pointer, index, value);
-  }
-
-  Int32List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JIntMarker>(rangeLength);
-    Jni.env.GetIntArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<int> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JIntMarker>(sizeOf<JIntMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetIntArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<int> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JLongArray$NullableType$ extends JType<JLongArray?> {
-  const $JLongArray$NullableType$();
-
-  @override
-  String get signature => '[J';
-
-  @override
-  JLongArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JLongArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JLongArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JLongArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JLongArray$NullableType$ &&
-        other is $JLongArray$NullableType$;
-  }
-}
-
-@internal
-final class $JLongArray$Type$ extends JType<JLongArray> {
-  const $JLongArray$Type$();
-
-  @override
-  String get signature => '[J';
-
-  @override
-  JLongArray fromReference(JReference reference) =>
-      JLongArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JLongArray?> get nullableType => const $JLongArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JLongArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JLongArray$Type$ && other is $JLongArray$Type$;
-  }
-}
-
-class JLongArray extends JObject with Iterable<int> {
-  @internal
-  @override
-  final JType<JLongArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JLongArray> type = $JLongArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JLongArray?> nullableType = $JLongArray$NullableType$();
-
-  /// Construct a new [JLongArray] with [reference] as its underlying
-  /// reference.
-  JLongArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JLongArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JLongArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JLongArray.fromReference(
-        JGlobalReference(Jni.env.NewLongArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  int elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetLongArrayElement(reference.pointer, index);
-  }
-
-  int operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, int value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetLongArrayElement(reference.pointer, index, value);
-  }
-
-  Int64List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JLongMarker>(rangeLength);
-    Jni.env.GetLongArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<int> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JLongMarker>(sizeOf<JLongMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetLongArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<int> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JFloatArray$NullableType$ extends JType<JFloatArray?> {
-  const $JFloatArray$NullableType$();
-
-  @override
-  String get signature => '[F';
-
-  @override
-  JFloatArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JFloatArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JFloatArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JFloatArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JFloatArray$NullableType$ &&
-        other is $JFloatArray$NullableType$;
-  }
-}
-
-@internal
-final class $JFloatArray$Type$ extends JType<JFloatArray> {
-  const $JFloatArray$Type$();
-
-  @override
-  String get signature => '[F';
-
-  @override
-  JFloatArray fromReference(JReference reference) =>
-      JFloatArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JFloatArray?> get nullableType => const $JFloatArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JFloatArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JFloatArray$Type$ &&
-        other is $JFloatArray$Type$;
-  }
-}
-
-class JFloatArray extends JObject with Iterable<double> {
-  @internal
-  @override
-  final JType<JFloatArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JFloatArray> type = $JFloatArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JFloatArray?> nullableType = $JFloatArray$NullableType$();
-
-  /// Construct a new [JFloatArray] with [reference] as its underlying
-  /// reference.
-  JFloatArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JFloatArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JFloatArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JFloatArray.fromReference(
-        JGlobalReference(Jni.env.NewFloatArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  double elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetFloatArrayElement(reference.pointer, index);
-  }
-
-  double operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, double value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetFloatArrayElement(reference.pointer, index, value);
-  }
-
-  Float32List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JFloatMarker>(rangeLength);
-    Jni.env.GetFloatArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<double> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JFloatMarker>(sizeOf<JFloatMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetFloatArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<double> get iterator => _JArrayIterator(this);
-}
-
-@internal
-final class $JDoubleArray$NullableType$ extends JType<JDoubleArray?> {
-  const $JDoubleArray$NullableType$();
-
-  @override
-  String get signature => '[D';
-
-  @override
-  JDoubleArray? fromReference(JReference reference) =>
-      reference.isNull ? null : JDoubleArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JDoubleArray?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JDoubleArray$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JDoubleArray$NullableType$ &&
-        other is $JDoubleArray$NullableType$;
-  }
-}
-
-@internal
-final class $JDoubleArray$Type$ extends JType<JDoubleArray> {
-  const $JDoubleArray$Type$();
-
-  @override
-  String get signature => '[D';
-
-  @override
-  JDoubleArray fromReference(JReference reference) =>
-      JDoubleArray.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JDoubleArray?> get nullableType => const $JDoubleArray$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JDoubleArray$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JDoubleArray$Type$ &&
-        other is $JDoubleArray$Type$;
-  }
-}
-
-class JDoubleArray extends JObject with Iterable<double> {
-  @internal
-  @override
-  final JType<JDoubleArray> $type;
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JDoubleArray> type = $JDoubleArray$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JDoubleArray?> nullableType =
-      $JDoubleArray$NullableType$();
-
-  /// Construct a new [JDoubleArray] with [reference] as its underlying
-  /// reference.
-  JDoubleArray.fromReference(super.reference)
-      : $type = type,
-        super.fromReference();
-
-  /// Creates a [JDoubleArray] of the given [length].
-  ///
-  /// The [length] must be a non-negative integer.
-  factory JDoubleArray(int length) {
-    RangeError.checkNotNegative(length);
-    return JDoubleArray.fromReference(
-        JGlobalReference(Jni.env.NewDoubleArray(length)));
-  }
-
-  /// The number of elements in this array.
-  @override
-  late final length = Jni.env.GetArrayLength(reference.pointer);
-
-  @override
-  double elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return Jni.env.GetDoubleArrayElement(reference.pointer, index);
-  }
-
-  double operator [](int index) {
-    return elementAt(index);
-  }
-
-  void operator []=(int index, double value) {
-    RangeError.checkValidIndex(index, this);
-    Jni.env.SetDoubleArrayElement(reference.pointer, index, value);
-  }
-
-  Float64List getRange(int start, int end, {Allocator allocator = malloc}) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    final buffer = allocator<JDoubleMarker>(rangeLength);
-    Jni.env.GetDoubleArrayRegion(reference.pointer, start, rangeLength, buffer);
-    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
-  }
-
-  void setRange(int start, int end, Iterable<double> iterable,
-      [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, length);
-    final rangeLength = end - start;
-    _allocate<JDoubleMarker>(sizeOf<JDoubleMarker>() * rangeLength, (ptr) {
-      ptr
-          .asTypedList(rangeLength)
-          .setRange(0, rangeLength, iterable, skipCount);
-      Jni.env.SetDoubleArrayRegion(reference.pointer, start, rangeLength, ptr);
-    });
-  }
-
-  @override
-  Iterator<double> get iterator => _JArrayIterator(this);
-}
diff --git a/pkgs/jni/lib/src/jclass.dart b/pkgs/jni/lib/src/jclass.dart
index 4807580..f41f53d 100644
--- a/pkgs/jni/lib/src/jclass.dart
+++ b/pkgs/jni/lib/src/jclass.dart
@@ -156,12 +156,16 @@
         });
 
   /// Constructs an instance of [jClass] with the given arguments.
-  DartT call<JavaT, DartT>(JClass jClass,
-      JConstructable<JavaT, DartT> returnType, List<dynamic> args) {
+  DartT call<DartT>(JClass jClass, List<dynamic> args) {
     return using((arena) {
       final jClassRef = jClass.reference;
-      return returnType._newObject(jClassRef.pointer, this as JMethodIDPtr,
-          toJValues(args, allocator: arena));
+      return JObject.fromReference(
+        JGlobalReference(Jni.env.NewObjectA(
+          jClassRef.pointer,
+          this as JMethodIDPtr,
+          toJValues(args, allocator: arena),
+        )),
+      ) as DartT;
     });
   }
 }
diff --git a/pkgs/jni/lib/src/jimplementer.dart b/pkgs/jni/lib/src/jimplementer.dart
index 6196c56..454bd5b 100644
--- a/pkgs/jni/lib/src/jimplementer.dart
+++ b/pkgs/jni/lib/src/jimplementer.dart
@@ -11,7 +11,6 @@
 import 'accessors.dart';
 import 'jni.dart';
 import 'jobject.dart';
-import 'jreference.dart';
 import 'lang/jstring.dart';
 import 'third_party/generated_bindings.dart';
 import 'types.dart';
@@ -83,9 +82,7 @@
         binaryNameRef.pointer,
         port.sendPort.nativePort,
         pointer.address,
-        (asyncMethods
-                .map((m) => m.toJString()..releasedBy(arena))
-                .toJList(JString.type)
+        (asyncMethods.map((m) => m.toJString()..releasedBy(arena)).toJList()
               ..releasedBy(arena))
             .reference
             .pointer,
@@ -114,17 +111,7 @@
   /// added interfaces with the given implementations.
   ///
   /// Releases this implementer.
-  T implement<T extends JObject>(JType<T> type) {
-    return type.fromReference(implementReference());
-  }
-
-  /// Used in the JNIgen generated code.
-  ///
-  /// It is unnecessary to construct the type object when the code is generated.
-  @internal
-  JReference implementReference() {
-    final ref = _build(reference.pointer, _buildId as JMethodIDPtr).reference;
-    release();
-    return ref;
+  T implement<T extends JObject>() {
+    return _build(reference.pointer, _buildId as JMethodIDPtr).object<T>();
   }
 }
diff --git a/pkgs/jni/lib/src/jobject.dart b/pkgs/jni/lib/src/jobject.dart
index 40e58fd..7d2d24b 100644
--- a/pkgs/jni/lib/src/jobject.dart
+++ b/pkgs/jni/lib/src/jobject.dart
@@ -24,71 +24,6 @@
   }
 }
 
-@internal
-final class $JObject$NullableType$ extends JType<JObject?> {
-  const $JObject$NullableType$();
-
-  @override
-  String get signature => 'Ljava/lang/Object;';
-
-  @override
-  JObject? fromReference(JReference reference) =>
-      reference.isNull ? null : JObject.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType get nullableType => this;
-
-  // TODO(#70): Once interface implementation lands, other than [superType],
-  // we should have a list of implemented interfaces.
-
-  @override
-  final int superCount = 0;
-
-  @override
-  int get hashCode => ($JObject$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JObject$NullableType$ &&
-        other is $JObject$NullableType$;
-  }
-}
-
-@internal
-final class $JObject$Type$ extends JType<JObject> {
-  const $JObject$Type$();
-
-  @override
-  String get signature => 'Ljava/lang/Object;';
-
-  @override
-  JObject fromReference(JReference reference) =>
-      JObject.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType get nullableType => const $JObject$NullableType$();
-
-  // TODO(#70): Once interface implementation lands, other than [superType],
-  // we should have a list of implemented interfaces.
-
-  @override
-  final int superCount = 0;
-
-  @override
-  int get hashCode => ($JObject$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JObject$Type$ && other is $JObject$Type$;
-  }
-}
-
 /// A high-level wrapper for JNI global object reference.
 ///
 /// This is the base class for classes generated by `jnigen`.
@@ -96,14 +31,8 @@
   @internal
   final JReference reference;
 
-  @internal
-  final JType<JObject> $type = type;
-
   /// The type which includes information such as the signature of this class.
-  static const JType<JObject> type = $JObject$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JObject?> nullableType = $JObject$NullableType$();
+  static const JType<JObject> type = JType('java/lang/Object');
 
   /// Constructs a [JObject] with the underlying [reference].
   JObject.fromReference(this.reference) {
@@ -173,12 +102,13 @@
     }
 
     if (releaseOriginal) {
-      final ret = type.fromReference(JGlobalReference(reference.pointer));
+      final ret =
+          JObject.fromReference(JGlobalReference(reference.pointer)) as T;
       reference.setAsReleased();
       return ret;
     }
     final newRef = JGlobalReference(Jni.env.NewGlobalRef(reference.pointer));
-    return type.fromReference(newRef);
+    return JObject.fromReference(newRef) as T;
   }
 
   static final _class = JClass.forName('java/lang/Object');
diff --git a/pkgs/jni/lib/src/lang/jboolean.dart b/pkgs/jni/lib/src/lang/jboolean.dart
index 67c9079..54fb5bb 100644
--- a/pkgs/jni/lib/src/lang/jboolean.dart
+++ b/pkgs/jni/lib/src/lang/jboolean.dart
@@ -2,92 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/meta.dart' show internal;
-
 import '../jobject.dart';
-import '../jreference.dart';
 import '../types.dart';
 
-@internal
-final class $JBoolean$NullableType$ extends JType<JBoolean?> {
-  const $JBoolean$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Boolean;';
-
-  @override
-  JBoolean? fromReference(JReference reference) =>
-      reference.isNull ? null : JBoolean.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JBoolean?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JBoolean$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JBoolean$NullableType$ &&
-        other is $JBoolean$NullableType$;
-  }
-}
-
-@internal
-final class $JBoolean$Type$ extends JType<JBoolean> {
-  const $JBoolean$Type$();
-
-  @override
-  String get signature => r'Ljava/lang/Boolean;';
-
-  @override
-  JBoolean fromReference(JReference reference) =>
-      JBoolean.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JBoolean?> get nullableType => const $JBoolean$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JBoolean$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JBoolean$Type$ && other is $JBoolean$Type$;
-  }
-}
-
-class JBoolean extends JObject {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JBoolean> $type = type;
-
-  JBoolean.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JBoolean._(JObject _$this) implements JObject {
   /// The type which includes information such as the signature of this class.
-  static const JType<JBoolean> type = $JBoolean$Type$();
+  static const JType<JBoolean> type = JType(r'java/lang/Boolean');
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JBoolean?> nullableType = $JBoolean$NullableType$();
-
-  static final _class = JClass.forName(r'java/lang/Boolean');
+  static final _class = type.jClass;
 
   static final _ctorId = _class.constructorId(r'(Z)V');
-  JBoolean(bool boolean)
-      : super.fromReference(_ctorId(_class, referenceType, [boolean ? 1 : 0]));
+
+  JBoolean(bool boolean) : _$this = _ctorId(_class, [boolean ? 1 : 0]);
 
   static final _booleanValueId =
       _class.instanceMethodId(r'booleanValue', r'()Z');
diff --git a/pkgs/jni/lib/src/lang/jbyte.dart b/pkgs/jni/lib/src/lang/jbyte.dart
index d8a4dd5..47fd81a 100644
--- a/pkgs/jni/lib/src/lang/jbyte.dart
+++ b/pkgs/jni/lib/src/lang/jbyte.dart
@@ -2,90 +2,25 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/meta.dart' show internal;
-
-import '../jreference.dart';
+import '../jobject.dart';
 import '../jvalues.dart';
 import '../types.dart';
 import 'jnumber.dart';
 
-@internal
-final class $JByte$NullableType$ extends JType<JByte?> {
-  const $JByte$NullableType$();
+final class _$JByte$Type$ extends JType<JByte> {
+  const _$JByte$Type$();
 
   @override
   String get signature => r'Ljava/lang/Byte;';
-
-  @override
-  JByte? fromReference(JReference reference) =>
-      reference.isNull ? null : JByte.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$NullableType$();
-
-  @override
-  JType<JByte?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JByte$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JByte$NullableType$ &&
-        other is $JByte$NullableType$;
-  }
 }
 
-@internal
-final class $JByte$Type$ extends JType<JByte> {
-  const $JByte$Type$();
-
-  @override
-  String get signature => r'Ljava/lang/Byte;';
-
-  @override
-  JByte fromReference(JReference reference) => JByte.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$Type$();
-
-  @override
-  JType<JByte?> get nullableType => const $JByte$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JByte$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JByte$Type$ && other is $JByte$Type$;
-  }
-}
-
-class JByte extends JNumber {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JByte> $type = type;
-
-  JByte.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JByte._(JObject _$this) implements JNumber {
   /// The type which includes information such as the signature of this class.
-  static const JType<JByte> type = $JByte$Type$();
-
-  /// The type which includes information such as the signature of this class.
-  static const JType<JByte?> nullableType = $JByte$NullableType$();
+  static const JType<JByte> type = _$JByte$Type$();
 
   static final _class = JClass.forName(r'java/lang/Byte');
 
   static final _ctorId = _class.constructorId(r'(B)V');
-  JByte(int num)
-      : super.fromReference(_ctorId(_class, referenceType, [JValueByte(num)]));
+
+  JByte(int num) : _$this = _ctorId(_class, [JValueByte(num)]);
 }
diff --git a/pkgs/jni/lib/src/lang/jcharacter.dart b/pkgs/jni/lib/src/lang/jcharacter.dart
index 1689d7c..c767089 100644
--- a/pkgs/jni/lib/src/lang/jcharacter.dart
+++ b/pkgs/jni/lib/src/lang/jcharacter.dart
@@ -5,91 +5,26 @@
 import 'package:meta/meta.dart' show internal;
 
 import '../jobject.dart';
-import '../jreference.dart';
 import '../jvalues.dart';
 import '../types.dart';
 
 @internal
-final class $JCharacter$NullableType$ extends JType<JCharacter?> {
-  const $JCharacter$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Character;';
-
-  @override
-  JCharacter? fromReference(JReference reference) =>
-      reference.isNull ? null : JCharacter.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JCharacter?> get nullableType => this;
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => ($JCharacter$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JCharacter$NullableType$ &&
-        other is $JCharacter$NullableType$;
-  }
-}
-
-@internal
 final class $JCharacter$Type$ extends JType<JCharacter> {
   const $JCharacter$Type$();
 
   @override
   String get signature => r'Ljava/lang/Character;';
-
-  @override
-  JCharacter fromReference(JReference reference) =>
-      JCharacter.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JCharacter?> get nullableType => const $JCharacter$NullableType$();
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => ($JCharacter$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JCharacter$Type$ && other is $JCharacter$Type$;
-  }
 }
 
-class JCharacter extends JObject {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JCharacter> $type = type;
-
-  JCharacter.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JCharacter._(JObject _$this) implements JObject {
   /// The type which includes information such as the signature of this class.
   static const JType<JCharacter> type = $JCharacter$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JCharacter?> nullableType = $JCharacter$NullableType$();
-
   static final _class = JClass.forName(r'java/lang/Character');
 
   static final _ctorId = _class.constructorId(r'(C)V');
 
-  JCharacter(int c)
-      : super.fromReference(_ctorId(_class, referenceType, [JValueChar(c)]));
+  JCharacter(int c) : _$this = _ctorId(_class, [JValueChar(c)]);
 
   static final _charValueId = _class.instanceMethodId(r'charValue', r'()C');
 
diff --git a/pkgs/jni/lib/src/lang/jdouble.dart b/pkgs/jni/lib/src/lang/jdouble.dart
index 9e4c237..3efe556 100644
--- a/pkgs/jni/lib/src/lang/jdouble.dart
+++ b/pkgs/jni/lib/src/lang/jdouble.dart
@@ -4,88 +4,25 @@
 
 import 'package:meta/meta.dart' show internal;
 
-import '../jreference.dart';
+import '../jobject.dart';
 import '../types.dart';
 import 'jnumber.dart';
 
 @internal
-final class $JDouble$NullableType$ extends JType<JDouble?> {
-  const $JDouble$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Double;';
-
-  @override
-  JDouble? fromReference(JReference reference) =>
-      reference.isNull ? null : JDouble.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$NullableType$();
-
-  @override
-  JType<JDouble?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JDouble$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JDouble$NullableType$ &&
-        other is $JDouble$NullableType$;
-  }
-}
-
-@internal
 final class $JDouble$Type$ extends JType<JDouble> {
   const $JDouble$Type$();
 
   @override
   String get signature => r'Ljava/lang/Double;';
-
-  @override
-  JDouble fromReference(JReference reference) =>
-      JDouble.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$Type$();
-
-  @override
-  JType<JDouble?> get nullableType => const $JDouble$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JDouble$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JDouble$Type$ && other is $JDouble$Type$;
-  }
 }
 
-class JDouble extends JNumber {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JDouble> $type = type;
-
-  JDouble.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JDouble._(JObject _$this) implements JNumber {
   /// The type which includes information such as the signature of this class.
   static const JType<JDouble> type = $JDouble$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JDouble?> nullableType = $JDouble$NullableType$();
-
   static final _class = JClass.forName(r'java/lang/Double');
 
   static final _ctorId = _class.constructorId(r'(D)V');
-  JDouble(double num)
-      : super.fromReference(_ctorId(_class, referenceType, [num]));
+
+  JDouble(double num) : _$this = _ctorId(_class, [num]);
 }
diff --git a/pkgs/jni/lib/src/lang/jfloat.dart b/pkgs/jni/lib/src/lang/jfloat.dart
index 1649fb7..934121f 100644
--- a/pkgs/jni/lib/src/lang/jfloat.dart
+++ b/pkgs/jni/lib/src/lang/jfloat.dart
@@ -2,91 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:meta/meta.dart' show internal;
-
-import '../jreference.dart';
+import '../jobject.dart';
 import '../jvalues.dart';
 import '../types.dart';
 import 'jnumber.dart';
 
-@internal
-final class $JFloat$NullableType$ extends JType<JFloat?> {
-  const $JFloat$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Float;';
-
-  @override
-  JFloat? fromReference(JReference reference) =>
-      reference.isNull ? null : JFloat.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$NullableType$();
-
-  @override
-  JType<JFloat?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JFloat$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JFloat$NullableType$ &&
-        other is $JFloat$NullableType$;
-  }
-}
-
-@internal
-final class $JFloat$Type$ extends JType<JFloat> {
-  const $JFloat$Type$();
-
-  @override
-  String get signature => r'Ljava/lang/Float;';
-
-  @override
-  JFloat fromReference(JReference reference) => JFloat.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$Type$();
-
-  @override
-  JType<JFloat?> get nullableType => const $JFloat$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JFloat$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JFloat$Type$ && other is $JFloat$Type$;
-  }
-}
-
-class JFloat extends JNumber {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JFloat> $type = type;
-
-  JFloat.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JFloat._(JObject _$this) implements JNumber {
   /// The type which includes information such as the signature of this class.
-  static const JType<JFloat> type = $JFloat$Type$();
+  static const JType<JFloat> type = JType(r'java/lang/Float');
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JFloat?> nullableType = $JFloat$NullableType$();
-
-  static final _class = JClass.forName(r'java/lang/Float');
+  static final _class = type.jClass;
 
   static final _ctorId = _class.constructorId(r'(F)V');
 
-  JFloat(double num)
-      : super.fromReference(_ctorId(_class, referenceType, [JValueFloat(num)]));
+  JFloat(double num) : _$this = _ctorId(_class, [JValueFloat(num)]);
 }
diff --git a/pkgs/jni/lib/src/lang/jinteger.dart b/pkgs/jni/lib/src/lang/jinteger.dart
index b856aed..bdff480 100644
--- a/pkgs/jni/lib/src/lang/jinteger.dart
+++ b/pkgs/jni/lib/src/lang/jinteger.dart
@@ -4,89 +4,26 @@
 
 import 'package:meta/meta.dart' show internal;
 
-import '../jreference.dart';
+import '../jobject.dart';
 import '../jvalues.dart';
 import '../types.dart';
 import 'jnumber.dart';
 
 @internal
-final class $JInteger$NullableType$ extends JType<JInteger?> {
-  const $JInteger$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Integer;';
-
-  @override
-  JInteger? fromReference(JReference reference) =>
-      reference.isNull ? null : JInteger.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$NullableType$();
-
-  @override
-  JType<JInteger?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JInteger$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JInteger$NullableType$ &&
-        other is $JInteger$NullableType$;
-  }
-}
-
-@internal
 final class $JInteger$Type$ extends JType<JInteger> {
   const $JInteger$Type$();
 
   @override
   String get signature => r'Ljava/lang/Integer;';
-
-  @override
-  JInteger fromReference(JReference reference) =>
-      JInteger.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$Type$();
-
-  @override
-  JType<JInteger?> get nullableType => const $JInteger$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JInteger$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JInteger$Type$ && other is $JInteger$Type$;
-  }
 }
 
-class JInteger extends JNumber {
-  @override
-  // ignore: overridden_fields
-  final JType<JInteger> $type = type;
-
-  JInteger.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JInteger._(JObject _$this) implements JNumber {
   /// The type which includes information such as the signature of this class.
   static const JType<JInteger> type = $JInteger$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JInteger?> nullableType = $JInteger$NullableType$();
-
   static final _class = JClass.forName(r'java/lang/Integer');
 
   static final _ctorId = _class.constructorId('(I)V');
 
-  JInteger(int num)
-      : super.fromReference(_ctorId(_class, referenceType, [JValueInt(num)]));
+  JInteger(int num) : _$this = _ctorId(_class, [JValueInt(num)]);
 }
diff --git a/pkgs/jni/lib/src/lang/jlong.dart b/pkgs/jni/lib/src/lang/jlong.dart
index 62173f3..765dd82 100644
--- a/pkgs/jni/lib/src/lang/jlong.dart
+++ b/pkgs/jni/lib/src/lang/jlong.dart
@@ -4,87 +4,25 @@
 
 import 'package:meta/meta.dart' show internal;
 
-import '../jreference.dart';
+import '../jobject.dart';
 import '../types.dart';
 import 'jnumber.dart';
 
 @internal
-final class $JLong$NullableType$ extends JType<JLong?> {
-  const $JLong$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Long;';
-
-  @override
-  JLong? fromReference(JReference reference) =>
-      reference.isNull ? null : JLong.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$NullableType$();
-
-  @override
-  JType<JLong?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JLong$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JLong$NullableType$ &&
-        other is $JLong$NullableType$;
-  }
-}
-
-@internal
 final class $JLong$Type$ extends JType<JLong> {
   const $JLong$Type$();
 
   @override
   String get signature => r'Ljava/lang/Long;';
-
-  @override
-  JLong fromReference(JReference reference) => JLong.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$Type$();
-
-  @override
-  JType<JLong?> get nullableType => const $JLong$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JLong$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JLong$Type$ && other is $JLong$Type$;
-  }
 }
 
-class JLong extends JNumber {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JLong> $type = type;
-
-  JLong.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JLong._(JObject _$this) implements JNumber {
   /// The type which includes information such as the signature of this class.
   static const JType<JLong> type = $JLong$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JLong?> nullableType = $JLong$NullableType$();
-
   static final _class = JClass.forName(r'java/lang/Long');
 
   static final _ctorId = _class.constructorId(r'(J)V');
 
-  JLong(int num) : super.fromReference(_ctorId(_class, referenceType, [num]));
+  JLong(int num) : _$this = _ctorId(_class, [num]);
 }
diff --git a/pkgs/jni/lib/src/lang/jnumber.dart b/pkgs/jni/lib/src/lang/jnumber.dart
index 6863c00..7c3f25d 100644
--- a/pkgs/jni/lib/src/lang/jnumber.dart
+++ b/pkgs/jni/lib/src/lang/jnumber.dart
@@ -5,7 +5,6 @@
 import 'package:meta/meta.dart' show internal;
 
 import '../jobject.dart';
-import '../jreference.dart';
 import '../types.dart';
 import 'jboolean.dart';
 import 'jbyte.dart';
@@ -17,85 +16,22 @@
 import 'jshort.dart';
 
 @internal
-final class $JNumber$NullableType$ extends JType<JNumber?> {
-  const $JNumber$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Number;';
-
-  @override
-  JNumber? fromReference(JReference reference) =>
-      reference.isNull ? null : JNumber.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JNumber?> get nullableType => this;
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => ($JNumber$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JNumber$NullableType$ &&
-        other is $JNumber$NullableType$;
-  }
-}
-
-@internal
 final class $JNumber$Type$ extends JType<JNumber> {
   const $JNumber$Type$();
 
   @override
   String get signature => r'Ljava/lang/Number;';
-
-  @override
-  JNumber fromReference(JReference reference) =>
-      JNumber.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JNumber?> get nullableType => const $JNumber$NullableType$();
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => ($JNumber$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JNumber$Type$ && other is $JNumber$Type$;
-  }
 }
 
-class JNumber extends JObject {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JNumber> $type = type;
-
-  JNumber.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JNumber._(JObject _$this) implements JObject {
   static final _class = JClass.forName(r'java/lang/Number');
 
   /// The type which includes information such as the signature of this class.
   static const JType<JNumber> type = $JNumber$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JNumber?> nullableType = $JNumber$NullableType$();
-
   static final _ctorId = _class.constructorId(r'()V');
 
-  JNumber() : super.fromReference(_ctorId(_class, referenceType, []));
+  JNumber() : _$this = JObject.fromReference(_ctorId(_class, []));
 
   static final _intValueId = _class.instanceMethodId(r'intValue', r'()I');
 
diff --git a/pkgs/jni/lib/src/lang/jshort.dart b/pkgs/jni/lib/src/lang/jshort.dart
index f15c266..e64210b 100644
--- a/pkgs/jni/lib/src/lang/jshort.dart
+++ b/pkgs/jni/lib/src/lang/jshort.dart
@@ -4,89 +4,26 @@
 
 import 'package:meta/meta.dart' show internal;
 
-import '../jreference.dart';
+import '../jobject.dart';
 import '../jvalues.dart';
 import '../types.dart';
 import 'jnumber.dart';
 
 @internal
-final class $JShort$NullableType$ extends JType<JShort?> {
-  const $JShort$NullableType$();
-
-  @override
-  String get signature => r'Ljava/lang/Short;';
-
-  @override
-  JShort? fromReference(JReference reference) =>
-      reference.isNull ? null : JShort.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$NullableType$();
-
-  @override
-  JType<JShort?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JShort$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JShort$NullableType$ &&
-        other is $JShort$NullableType$;
-  }
-}
-
-@internal
 final class $JShort$Type$ extends JType<JShort> {
   const $JShort$Type$();
 
   @override
   String get signature => r'Ljava/lang/Short;';
-
-  @override
-  JShort fromReference(JReference reference) => JShort.fromReference(reference);
-
-  @override
-  JType get superType => const $JNumber$Type$();
-
-  @override
-  JType<JShort?> get nullableType => const $JShort$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JShort$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JShort$Type$ && other is $JShort$Type$;
-  }
 }
 
-class JShort extends JNumber {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JShort> $type = type;
-
-  JShort.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JShort._(JObject _$this) implements JNumber {
   /// The type which includes information such as the signature of this class.
   static const JType<JShort> type = $JShort$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JShort?> nullableType = $JShort$NullableType$();
-
   static final _class = JClass.forName(r'java/lang/Short');
 
   static final _ctorId = _class.constructorId(r'(S)V');
 
-  JShort(int num)
-      : super.fromReference(_ctorId(_class, referenceType, [JValueShort(num)]));
+  JShort(int num) : _$this = _ctorId(_class, [JValueShort(num)]);
 }
diff --git a/pkgs/jni/lib/src/lang/jstring.dart b/pkgs/jni/lib/src/lang/jstring.dart
index 5d97648..a1cf311 100644
--- a/pkgs/jni/lib/src/lang/jstring.dart
+++ b/pkgs/jni/lib/src/lang/jstring.dart
@@ -10,85 +10,24 @@
 import '../types.dart';
 
 @internal
-final class $JString$NullableType$ extends JType<JString?> {
-  const $JString$NullableType$();
-
-  @override
-  String get signature => 'Ljava/lang/String;';
-
-  @override
-  JString? fromReference(JReference reference) =>
-      reference.isNull ? null : JString.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JString?> get nullableType => this;
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JString$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JString$NullableType$ &&
-        other is $JString$NullableType$;
-  }
-}
-
-@internal
 final class $JString$Type$ extends JType<JString> {
   const $JString$Type$();
 
   @override
   String get signature => 'Ljava/lang/String;';
-
-  @override
-  JString fromReference(JReference reference) =>
-      JString.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JString?> get nullableType => const $JString$NullableType$();
-
-  @override
-  final int superCount = 1;
-
-  @override
-  int get hashCode => ($JString$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JString$Type$ && other is $JString$Type$;
-  }
 }
 
-class JString extends JObject {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JString> $type = type;
-
+extension type JString._(JObject _$this) implements JObject {
   /// The type which includes information such as the signature of this class.
   static const JType<JString> type = $JString$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JString?> nullableType = $JString$NullableType$();
-
-  /// Construct a new [JString] with [reference] as its underlying reference.
-  JString.fromReference(super.reference) : super.fromReference();
-
   /// The number of Unicode characters in this Java string.
   int get length => Jni.env.GetStringLength(reference.pointer);
 
   /// Construct a [JString] from the contents of Dart string [s].
   JString.fromString(String s)
-      : super.fromReference(JGlobalReference(Jni.env.toJStringPtr(s)));
+      : _$this =
+            JObject.fromReference(JGlobalReference(Jni.env.toJStringPtr(s)));
 
   /// Returns the contents as a Dart String.
   ///
diff --git a/pkgs/jni/lib/src/lang/lang.dart b/pkgs/jni/lib/src/lang/lang.dart
index 862444c..786488c 100644
--- a/pkgs/jni/lib/src/lang/lang.dart
+++ b/pkgs/jni/lib/src/lang/lang.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-export 'jboolean.dart' hide $JBoolean$NullableType$, $JBoolean$Type$;
-export 'jbyte.dart' hide $JByte$NullableType$, $JByte$Type$;
-export 'jcharacter.dart' hide $JCharacter$NullableType$, $JCharacter$Type$;
-export 'jdouble.dart' hide $JDouble$NullableType$, $JDouble$Type$;
-export 'jfloat.dart' hide $JFloat$NullableType$, $JFloat$Type$;
-export 'jinteger.dart' hide $JInteger$NullableType$, $JInteger$Type$;
-export 'jlong.dart' hide $JLong$NullableType$, $JLong$Type$;
-export 'jnumber.dart' hide $JNumber$NullableType$, $JNumber$Type$;
-export 'jshort.dart' hide $JShort$NullableType$, $JShort$Type$;
-export 'jstring.dart' hide $JString$NullableType$, $JString$Type$;
+export 'jboolean.dart';
+export 'jbyte.dart';
+export 'jcharacter.dart';
+export 'jdouble.dart';
+export 'jfloat.dart';
+export 'jinteger.dart';
+export 'jlong.dart';
+export 'jnumber.dart';
+export 'jshort.dart';
+export 'jstring.dart';
diff --git a/pkgs/jni/lib/src/method_invocation.dart b/pkgs/jni/lib/src/method_invocation.dart
index 470bc8f..197f91b 100644
--- a/pkgs/jni/lib/src/method_invocation.dart
+++ b/pkgs/jni/lib/src/method_invocation.dart
@@ -27,14 +27,14 @@
   ) {
     return MethodInvocation._(
       Pointer<CallbackResult>.fromAddress(resultAddress),
-      JString.fromReference(
-          JGlobalReference(Pointer<Void>.fromAddress(descriptorAddress))),
+      JObject.fromReference(
+              JGlobalReference(Pointer<Void>.fromAddress(descriptorAddress)))
+          as JString,
       argsAddress == 0
           ? null
-          : JArray.fromReference(
-              const $JObject$NullableType$(),
+          : JObject.fromReference(
               JGlobalReference(Pointer<Void>.fromAddress(argsAddress)),
-            ),
+            ) as JArray<JObject?>,
     );
   }
 
diff --git a/pkgs/jni/lib/src/nio/jbuffer.dart b/pkgs/jni/lib/src/nio/jbuffer.dart
index f4a9d2a..4103305 100644
--- a/pkgs/jni/lib/src/nio/jbuffer.dart
+++ b/pkgs/jni/lib/src/nio/jbuffer.dart
@@ -5,68 +5,16 @@
 import 'package:meta/meta.dart' show internal;
 
 import '../jobject.dart';
-import '../jreference.dart';
 import '../jvalues.dart';
 import '../types.dart';
 import 'jbyte_buffer.dart';
 
 @internal
-final class $JBuffer$NullableType$ extends JType<JBuffer?> {
-  const $JBuffer$NullableType$();
-
-  @override
-  String get signature => r'Ljava/nio/Buffer;';
-
-  @override
-  JBuffer? fromReference(JReference reference) =>
-      reference.isNull ? null : JBuffer.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JBuffer?> get nullableType => this;
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => ($JBuffer$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JBuffer$NullableType$ &&
-        other is $JBuffer$NullableType$;
-  }
-}
-
-@internal
 final class $JBuffer$Type$ extends JType<JBuffer> {
   const $JBuffer$Type$();
 
   @override
   String get signature => r'Ljava/nio/Buffer;';
-
-  @override
-  JBuffer fromReference(JReference reference) =>
-      JBuffer.fromReference(reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JBuffer?> get nullableType => const $JBuffer$NullableType$();
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => ($JBuffer$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JBuffer$Type$ && other is $JBuffer$Type$;
-  }
 }
 
 /// A container for data of a specific primitive type.
@@ -80,24 +28,12 @@
 /// There is one subclass of this class for each non-boolean primitive type.
 /// We currently only have the bindings for `java.nio.ByteBuffer` in this
 /// package as [JByteBuffer].
-class JBuffer extends JObject {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JBuffer> $type = type;
-
-  JBuffer.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JBuffer._(JObject _$this) implements JObject {
   static final _class = JClass.forName(r'java/nio/Buffer');
 
   /// The type which includes information such as the signature of this class.
   static const JType<JBuffer> type = $JBuffer$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JBuffer?> nullableType = $JBuffer$NullableType$();
-
   static final _capacityId = _class.instanceMethodId(r'capacity', r'()I');
 
   /// The number of elements this buffer contains.
diff --git a/pkgs/jni/lib/src/nio/jbyte_buffer.dart b/pkgs/jni/lib/src/nio/jbyte_buffer.dart
index 0b57762..907b8f2 100644
--- a/pkgs/jni/lib/src/nio/jbyte_buffer.dart
+++ b/pkgs/jni/lib/src/nio/jbyte_buffer.dart
@@ -16,63 +16,11 @@
 import 'jbuffer.dart';
 
 @internal
-final class $JByteBuffer$NullableType$ extends JType<JByteBuffer?> {
-  const $JByteBuffer$NullableType$();
-
-  @override
-  String get signature => r'Ljava/nio/ByteBuffer;';
-
-  @override
-  JByteBuffer? fromReference(JReference reference) =>
-      reference.isNull ? null : JByteBuffer.fromReference(reference);
-
-  @override
-  JType get superType => const $JByteBuffer$NullableType$();
-
-  @override
-  JType<JByteBuffer?> get nullableType => this;
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JByteBuffer$NullableType$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JByteBuffer$NullableType$ &&
-        other is $JByteBuffer$NullableType$;
-  }
-}
-
-@internal
 final class $JByteBuffer$Type$ extends JType<JByteBuffer> {
   const $JByteBuffer$Type$();
 
   @override
   String get signature => r'Ljava/nio/ByteBuffer;';
-
-  @override
-  JByteBuffer fromReference(JReference reference) =>
-      JByteBuffer.fromReference(reference);
-
-  @override
-  JType get superType => const $JBuffer$Type$();
-
-  @override
-  JType<JByteBuffer?> get nullableType => const $JByteBuffer$NullableType$();
-
-  @override
-  final superCount = 2;
-
-  @override
-  int get hashCode => ($JByteBuffer$Type$).hashCode;
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == $JByteBuffer$Type$ &&
-        other is $JByteBuffer$Type$;
-  }
 }
 
 /// A byte [JBuffer].
@@ -124,24 +72,12 @@
 /// final data2 = directBuffer.asUint8List(releaseOriginal: true);
 /// // directBuffer.nextByte = 42; // throws [UseAfterReleaseException]!
 /// ```
-class JByteBuffer extends JBuffer {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JByteBuffer> $type = type;
-
-  JByteBuffer.fromReference(
-    super.reference,
-  ) : super.fromReference();
-
+extension type JByteBuffer._(JObject _$this) implements JBuffer {
   static final _class = JClass.forName(r'java/nio/ByteBuffer');
 
   /// The type which includes information such as the signature of this class.
   static const JType<JByteBuffer> type = $JByteBuffer$Type$();
 
-  /// The type which includes information such as the signature of this class.
-  static const JType<JByteBuffer?> nullableType = $JByteBuffer$NullableType$();
-
   static final _allocateDirectId =
       _class.staticMethodId(r'allocateDirect', r'(I)Ljava/nio/ByteBuffer;');
 
@@ -260,7 +196,6 @@
 
   static final _arrayId = _class.instanceMethodId(r'array', r'()[B');
 
-  @override
   JByteArray get array {
     return _arrayId(this, JByteArray.type, [])!;
   }
diff --git a/pkgs/jni/lib/src/nio/nio.dart b/pkgs/jni/lib/src/nio/nio.dart
index 0775fec..d07d6e2 100644
--- a/pkgs/jni/lib/src/nio/nio.dart
+++ b/pkgs/jni/lib/src/nio/nio.dart
@@ -2,5 +2,5 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-export 'jbuffer.dart' hide $JBuffer$NullableType$, $JBuffer$Type$;
-export 'jbyte_buffer.dart' hide $JByteBuffer$NullableType$, $JByteBuffer$Type$;
+export 'jbuffer.dart' hide $JBuffer$Type$;
+export 'jbyte_buffer.dart' hide $JByteBuffer$Type$;
diff --git a/pkgs/jni/lib/src/primitive_jarrays.dart b/pkgs/jni/lib/src/primitive_jarrays.dart
new file mode 100644
index 0000000..994dbd7
--- /dev/null
+++ b/pkgs/jni/lib/src/primitive_jarrays.dart
@@ -0,0 +1,699 @@
+// AUTO GENERATED. DO NOT EDIT!
+//
+// To regenerate, run `dart run tool/generate_primtive_arrays.dart`
+
+part of 'jarray.dart';
+
+final class _$JBooleanArray$Type$ extends JType<JBooleanArray> {
+  const _$JBooleanArray$Type$();
+
+  @override
+  String get signature => '[Z';
+}
+
+/// A fixed-length array of Java Boolean.
+///
+/// Java equivalent of [Uint8List].
+extension type JBooleanArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JBooleanArray> type = _$JBooleanArray$Type$();
+
+  /// Creates a [JBooleanArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JBooleanArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewBooleanArray(length)),
+    ) as JBooleanArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  bool operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetBooleanArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, bool value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetBooleanArrayElement(reference.pointer, index, value);
+  }
+
+  Uint8List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Uint8>(rangeLength);
+    Jni.env
+        .GetBooleanArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<bool> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Uint8>(sizeOf<Uint8>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable.map((e) => e ? 1 : 0), skipCount);
+      Jni.env.SetBooleanArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JBooleanArrayListView
+    with ListMixin<bool>, NonGrowableListMixin<bool> {
+  final JBooleanArray _jarray;
+
+  _JBooleanArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  bool operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, bool value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JBooleanArrayToList on JBooleanArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<bool> get asDartList => _JBooleanArrayListView(this);
+}
+
+final class _$JByteArray$Type$ extends JType<JByteArray> {
+  const _$JByteArray$Type$();
+
+  @override
+  String get signature => '[B';
+}
+
+/// A fixed-length array of Java Byte.
+///
+/// Integers stored in the list are truncated to their low eight bits
+/// interpreted as a signed 8-bit two's complement integer with values in the
+/// range -128 to +127.
+///
+/// Java equivalent of [Int8List].
+extension type JByteArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JByteArray> type = _$JByteArray$Type$();
+
+  /// Creates a [JByteArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JByteArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewByteArray(length)),
+    ) as JByteArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  int operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetByteArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, int value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetByteArrayElement(reference.pointer, index, value);
+  }
+
+  Int8List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Int8>(rangeLength);
+    Jni.env.GetByteArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<int> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Int8>(sizeOf<Int8>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetByteArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JByteArrayListView with ListMixin<int>, NonGrowableListMixin<int> {
+  final JByteArray _jarray;
+
+  _JByteArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  int operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, int value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JByteArrayToList on JByteArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<int> get asDartList => _JByteArrayListView(this);
+}
+
+final class _$JCharArray$Type$ extends JType<JCharArray> {
+  const _$JCharArray$Type$();
+
+  @override
+  String get signature => '[C';
+}
+
+/// A fixed-length array of Java Char.
+///
+/// Integers stored in the list are truncated to their low 16 bits
+/// interpreted as an unsigned 16-bit integer with values in the
+/// range 0 to +65535.
+///
+/// Java equivalent of [Uint16List].
+extension type JCharArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JCharArray> type = _$JCharArray$Type$();
+
+  /// Creates a [JCharArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JCharArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewCharArray(length)),
+    ) as JCharArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  int operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetCharArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, int value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetCharArrayElement(reference.pointer, index, value);
+  }
+
+  Uint16List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Uint16>(rangeLength);
+    Jni.env.GetCharArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<int> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Uint16>(sizeOf<Uint16>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetCharArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JCharArrayListView with ListMixin<int>, NonGrowableListMixin<int> {
+  final JCharArray _jarray;
+
+  _JCharArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  int operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, int value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JCharArrayToList on JCharArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<int> get asDartList => _JCharArrayListView(this);
+}
+
+final class _$JShortArray$Type$ extends JType<JShortArray> {
+  const _$JShortArray$Type$();
+
+  @override
+  String get signature => '[S';
+}
+
+/// A fixed-length array of Java Short.
+///
+/// Integers stored in the list are truncated to their low 16 bits
+/// interpreted as a signed 16-bit two's complement integer with values in the
+/// range -32768 to +32767.
+///
+/// Java equivalent of [Int16List].
+extension type JShortArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JShortArray> type = _$JShortArray$Type$();
+
+  /// Creates a [JShortArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JShortArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewShortArray(length)),
+    ) as JShortArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  int operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetShortArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, int value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetShortArrayElement(reference.pointer, index, value);
+  }
+
+  Int16List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Int16>(rangeLength);
+    Jni.env.GetShortArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<int> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Int16>(sizeOf<Int16>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetShortArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JShortArrayListView
+    with ListMixin<int>, NonGrowableListMixin<int> {
+  final JShortArray _jarray;
+
+  _JShortArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  int operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, int value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JShortArrayToList on JShortArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<int> get asDartList => _JShortArrayListView(this);
+}
+
+final class _$JIntArray$Type$ extends JType<JIntArray> {
+  const _$JIntArray$Type$() : super('[I');
+}
+
+/// A fixed-length array of Java Int.
+///
+/// Integers stored in the list are truncated to their low 32 bits
+/// interpreted as a signed 32-bit two's complement integer with values in the
+/// range -2147483648 to +2147483647.
+///
+/// Java equivalent of [Int32List].
+extension type JIntArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JIntArray> type = _$JIntArray$Type$();
+
+  /// Creates a [JIntArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JIntArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewIntArray(length)),
+    ) as JIntArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  int operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetIntArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, int value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetIntArrayElement(reference.pointer, index, value);
+  }
+
+  Int32List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Int32>(rangeLength);
+    Jni.env.GetIntArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<int> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Int32>(sizeOf<Int32>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetIntArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JIntArrayListView with ListMixin<int>, NonGrowableListMixin<int> {
+  final JIntArray _jarray;
+
+  _JIntArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  int operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, int value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JIntArrayToList on JIntArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<int> get asDartList => _JIntArrayListView(this);
+}
+
+final class _$JLongArray$Type$ extends JType<JLongArray> {
+  const _$JLongArray$Type$();
+
+  @override
+  String get signature => '[J';
+}
+
+/// A fixed-length array of Java Long.
+///
+/// Integers stored in the list are truncated to their low 64 bits
+/// interpreted as a signed 64-bit two's complement integer with values in the
+/// range -9223372036854775808 to +9223372036854775807.
+///
+/// Java equivalent of [Int64List].
+extension type JLongArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JLongArray> type = _$JLongArray$Type$();
+
+  /// Creates a [JLongArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JLongArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewLongArray(length)),
+    ) as JLongArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  int operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetLongArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, int value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetLongArrayElement(reference.pointer, index, value);
+  }
+
+  Int64List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Int64>(rangeLength);
+    Jni.env.GetLongArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<int> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Int64>(sizeOf<Int64>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetLongArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JLongArrayListView with ListMixin<int>, NonGrowableListMixin<int> {
+  final JLongArray _jarray;
+
+  _JLongArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  int operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, int value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JLongArrayToList on JLongArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<int> get asDartList => _JLongArrayListView(this);
+}
+
+final class _$JFloatArray$Type$ extends JType<JFloatArray> {
+  const _$JFloatArray$Type$();
+
+  @override
+  String get signature => '[F';
+}
+
+/// A fixed-length array of Java Float.
+///
+/// Java equivalent of [Float32List].
+extension type JFloatArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JFloatArray> type = _$JFloatArray$Type$();
+
+  /// Creates a [JFloatArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JFloatArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewFloatArray(length)),
+    ) as JFloatArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  double operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetFloatArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, double value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetFloatArrayElement(reference.pointer, index, value);
+  }
+
+  Float32List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Float>(rangeLength);
+    Jni.env.GetFloatArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<double> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Float>(sizeOf<Float>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetFloatArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JFloatArrayListView
+    with ListMixin<double>, NonGrowableListMixin<double> {
+  final JFloatArray _jarray;
+
+  _JFloatArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  double operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, double value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JFloatArrayToList on JFloatArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<double> get asDartList => _JFloatArrayListView(this);
+}
+
+final class _$JDoubleArray$Type$ extends JType<JDoubleArray> {
+  const _$JDoubleArray$Type$();
+
+  @override
+  String get signature => '[D';
+}
+
+/// A fixed-length array of Java Double.
+///
+/// Java equivalent of [Float64List].
+extension type JDoubleArray._(JObject _$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<JDoubleArray> type = _$JDoubleArray$Type$();
+
+  /// Creates a [JDoubleArray] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory JDoubleArray(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.NewDoubleArray(length)),
+    ) as JDoubleArray;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  double operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.GetDoubleArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, double value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.SetDoubleArrayElement(reference.pointer, index, value);
+  }
+
+  Float64List getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<Double>(rangeLength);
+    Jni.env.GetDoubleArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<double> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<Double>(sizeOf<Double>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable, skipCount);
+      Jni.env.SetDoubleArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _JDoubleArrayListView
+    with ListMixin<double>, NonGrowableListMixin<double> {
+  final JDoubleArray _jarray;
+
+  _JDoubleArrayListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  double operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, double value) {
+    _jarray[index] = value;
+  }
+}
+
+extension JDoubleArrayToList on JDoubleArray {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<double> get asDartList => _JDoubleArrayListView(this);
+}
diff --git a/pkgs/jni/lib/src/types.dart b/pkgs/jni/lib/src/types.dart
index 58920c4..4c74e35 100644
--- a/pkgs/jni/lib/src/types.dart
+++ b/pkgs/jni/lib/src/types.dart
@@ -31,12 +31,6 @@
       JObjectPtr obj, JMethodIDPtr methodID, Pointer<JValue> args);
 }
 
-/// Able to be constructed.
-mixin JConstructable<JavaT, DartT> on JTypeBase<JavaT> {
-  DartT _newObject(
-      JClassPtr clazz, JMethodIDPtr methodID, Pointer<JValue> args);
-}
-
 /// Able to be the type of a field that can be get and set.
 mixin JAccessible<JavaT, DartT> on JTypeBase<JavaT> {
   DartT _staticGet(JClassPtr clazz, JFieldIDPtr fieldID);
@@ -45,80 +39,34 @@
   void _instanceSet(JObjectPtr obj, JFieldIDPtr fieldID, DartT val);
 }
 
-/// Only used for JNIgen.
-///
-/// Makes constructing objects easier inside the generated bindings by allowing
-/// a [JReference] to be created. This allows [JObject]s to use constructors
-/// that call `super.fromReference` instead of factories.
-@internal
-const referenceType = _ReferenceType();
-
-final class _ReferenceType extends JTypeBase<JReference>
-    with JConstructable<JReference, JReference> {
-  const _ReferenceType();
-
+class JType<T extends JObject?> extends JTypeBase<T>
+    with JCallable<T, T>, JAccessible<T, T> {
   @override
-  JReference _newObject(
-      JClassPtr clazz, JMethodIDPtr methodID, Pointer<JValue> args) {
-    return JGlobalReference(Jni.env.NewObjectA(clazz, methodID, args));
-  }
+  final String signature;
 
   @internal
-  @override
-  String get signature => 'Ljava/lang/Object;';
-}
-
-abstract class JType<T extends JObject?> extends JTypeBase<T>
-    with JCallable<T, T>, JConstructable<T, T>, JAccessible<T, T> {
-  /// Number of super types. Distance to the root type.
-  @internal
-  int get superCount;
-
-  @internal
-  JType get superType;
-
-  @internal
-  JType<T?> get nullableType;
-
-  @internal
-  bool get isNullable => this == nullableType;
-
-  @internal
-  const JType();
-
-  /// Creates an object from this type using the reference.
-  @internal
-  T fromReference(JReference reference);
+  const JType(this.signature);
 
   JClass get jClass {
-    if (signature.startsWith('L') && signature.endsWith(';')) {
-      return JClass.forName(signature.substring(1, signature.length - 1));
-    }
     return JClass.forName(signature);
   }
 
   @override
   T _staticCall(JClassPtr clazz, JMethodIDPtr methodID, Pointer<JValue> args) {
     final result = Jni.env.CallStaticObjectMethodA(clazz, methodID, args);
-    return fromReference(JGlobalReference(result));
+    return JObject.fromReference(JGlobalReference(result)) as T;
   }
 
   @override
   T _instanceCall(JObjectPtr obj, JMethodIDPtr methodID, Pointer<JValue> args) {
-    return fromReference(
-        JGlobalReference(Jni.env.CallObjectMethodA(obj, methodID, args)));
-  }
-
-  @override
-  T _newObject(JClassPtr clazz, JMethodIDPtr methodID, Pointer<JValue> args) {
-    return fromReference(
-        JGlobalReference(Jni.env.NewObjectA(clazz, methodID, args)));
+    return JObject.fromReference(
+        JGlobalReference(Jni.env.CallObjectMethodA(obj, methodID, args))) as T;
   }
 
   @override
   T _instanceGet(JObjectPtr obj, JFieldIDPtr fieldID) {
-    return fromReference(
-        JGlobalReference(Jni.env.GetObjectField(obj, fieldID)));
+    return JObject.fromReference(
+        JGlobalReference(Jni.env.GetObjectField(obj, fieldID))) as T;
   }
 
   @override
@@ -129,8 +77,8 @@
 
   @override
   T _staticGet(JClassPtr clazz, JFieldIDPtr fieldID) {
-    return fromReference(
-        JGlobalReference(Jni.env.GetStaticObjectField(clazz, fieldID)));
+    return JObject.fromReference(
+        JGlobalReference(Jni.env.GetStaticObjectField(clazz, fieldID))) as T;
   }
 
   @override
@@ -139,29 +87,3 @@
     Jni.env.SetStaticObjectField(clazz, fieldID, valRef.pointer);
   }
 }
-
-/// Lowest common ancestor of two types in the inheritance tree.
-JType<dynamic> _lowestCommonAncestor(JType<dynamic> a, JType<dynamic> b) {
-  if (a is! JType<JObject> || b is! JType<JObject>) {
-    // If one of the types are nullable, the common super type should also be
-    // nullable.
-    a = a.nullableType;
-    b = b.nullableType;
-  }
-  while (a.superCount > b.superCount) {
-    a = a.superType;
-  }
-  while (b.superCount > a.superCount) {
-    b = b.superType;
-  }
-  while (a != b) {
-    a = a.superType;
-    b = b.superType;
-  }
-  return a;
-}
-
-@internal
-JType<dynamic> lowestCommonSuperType(List<JType<dynamic>> types) {
-  return types.reduce(_lowestCommonAncestor);
-}
diff --git a/pkgs/jni/lib/src/util/jiterator.dart b/pkgs/jni/lib/src/util/jiterator.dart
index 573747d..dfd782d 100644
--- a/pkgs/jni/lib/src/util/jiterator.dart
+++ b/pkgs/jni/lib/src/util/jiterator.dart
@@ -9,74 +9,11 @@
 import '../types.dart';
 
 @internal
-final class $JIterator$NullableType$<$E extends JObject?>
-    extends JType<JIterator<$E>?> {
-  final JType<$E> E;
-
-  const $JIterator$NullableType$(
-    this.E,
-  );
+final class $JIterator$Type$ extends JType<JIterator> {
+  const $JIterator$Type$();
 
   @override
   String get signature => r'Ljava/util/Iterator;';
-
-  @override
-  JIterator<$E>? fromReference(JReference reference) =>
-      reference.isNull ? null : JIterator<$E>.fromReference(E, reference);
-
-  @override
-  JType get superType => const $JObject$NullableType$();
-
-  @override
-  JType<JIterator<$E>?> get nullableType => this;
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => Object.hash($JIterator$NullableType$, E);
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JIterator$NullableType$<$E>) &&
-        other is $JIterator$NullableType$<$E> &&
-        E == other.E;
-  }
-}
-
-@internal
-final class $JIterator$Type$<$E extends JObject?> extends JType<JIterator<$E>> {
-  final JType<$E> E;
-
-  const $JIterator$Type$(
-    this.E,
-  );
-
-  @override
-  String get signature => r'Ljava/util/Iterator;';
-
-  @override
-  JIterator<$E> fromReference(JReference reference) =>
-      JIterator<$E>.fromReference(E, reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JIterator<$E>?> get nullableType => $JIterator$NullableType$<$E>(E);
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => Object.hash($JIterator$Type$, E);
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JIterator$Type$<$E>) &&
-        other is $JIterator$Type$<$E> &&
-        E == other.E;
-  }
 }
 
 class JIterator<$E extends JObject?> extends JObject implements Iterator<$E> {
@@ -97,18 +34,7 @@
   static final _class = JClass.forName(r'java/util/Iterator');
 
   /// The type which includes information such as the signature of this class.
-  static JType<JIterator<$E>> type<$E extends JObject?>(
-    JType<$E> E,
-  ) {
-    return $JIterator$Type$<$E>(E);
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static JType<JIterator<$E>?> nullableType<$E extends JObject?>(
-    JType<$E> E,
-  ) {
-    return $JIterator$NullableType$<$E>(E);
-  }
+  static const JType<JIterator> type = JType(r'Ljava/util/Iterator;');
 
   $E? _current;
 
diff --git a/pkgs/jni/lib/src/util/jlist.dart b/pkgs/jni/lib/src/util/jlist.dart
index 40ddd76..a4c6bf4 100644
--- a/pkgs/jni/lib/src/util/jlist.dart
+++ b/pkgs/jni/lib/src/util/jlist.dart
@@ -15,110 +15,22 @@
 import 'jset.dart';
 
 @internal
-final class $JList$NullableType$<$E extends JObject?>
-    extends JType<JList<$E>?> {
-  final JType<$E> E;
-
-  const $JList$NullableType$(
-    this.E,
-  );
+final class $JList$Type$ extends JType<JList> {
+  const $JList$Type$();
 
   @override
   String get signature => r'Ljava/util/List;';
-
-  @override
-  JList<$E>? fromReference(JReference reference) =>
-      reference.isNull ? null : JList<$E>.fromReference(E, reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JList<$E>?> get nullableType => this;
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => Object.hash($JList$NullableType$, E);
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JList$NullableType$<$E>) &&
-        other is $JList$NullableType$<$E> &&
-        E == other.E;
-  }
 }
 
-@internal
-final class $JList$Type$<$E extends JObject?> extends JType<JList<$E>> {
-  final JType<$E> E;
-
-  const $JList$Type$(
-    this.E,
-  );
-
-  @override
-  String get signature => r'Ljava/util/List;';
-
-  @override
-  JList<$E> fromReference(JReference reference) =>
-      JList<$E>.fromReference(E, reference);
-
-  @override
-  JType get superType => const $JObject$Type$();
-
-  @override
-  JType<JList<$E>?> get nullableType => $JList$NullableType$<$E>(E);
-
-  @override
-  final superCount = 1;
-
-  @override
-  int get hashCode => Object.hash($JList$Type$, E);
-
-  @override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JList$Type$<$E>) &&
-        other is $JList$Type$<$E> &&
-        E == other.E;
-  }
-}
-
-class JList<$E extends JObject?> extends JObject with ListMixin<$E> {
-  @internal
-  @override
-  // ignore: overridden_fields
-  final JType<JList<$E>> $type;
-
-  @internal
-  final JType<$E> E;
-
-  JList.fromReference(
-    this.E,
-    JReference reference,
-  )   : $type = type<$E>(E),
-        super.fromReference(reference);
-
+extension type JList<$E extends JObject?>(JObject _$this) implements JObject {
   static final _class = JClass.forName(r'java/util/List');
 
   /// The type which includes information such as the signature of this class.
-  static JType<JList<$E>> type<$E extends JObject?>(
-    JType<$E> E,
-  ) {
-    return $JList$Type$<$E>(E);
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static JType<JList<$E>?> nullableType<$E extends JObject?>(JType<$E> E) {
-    return $JList$NullableType$<$E>(E);
-  }
+  static const JType<JList> type = $JList$Type$();
 
   static final _arrayListClassRef = JClass.forName(r'java/util/ArrayList');
   static final _ctorId = _arrayListClassRef.constructorId(r'()V');
-  JList.array(this.E)
-      : $type = type<$E>(E),
-        super.fromReference(_ctorId(_arrayListClassRef, referenceType, []));
+  JList.array() : _$this = _ctorId(_arrayListClassRef, []);
 
   static final _sizeId = _class.instanceMethodId(r'size', r'()I');
   @override
@@ -140,7 +52,7 @@
   @override
   $E operator [](int index) {
     RangeError.checkValidIndex(index, this);
-    return _getId(this, E, [JValueInt(index)]);
+    return _getId(this, JObject.type, [JValueInt(index)]) as $E;
   }
 
   static final _setId = _class.instanceMethodId(
@@ -148,7 +60,7 @@
   @override
   void operator []=(int index, $E value) {
     RangeError.checkValidIndex(index, this);
-    _setId(this, E, [JValueInt(index), value]);
+    _setId(this, JObject.type, [JValueInt(index), value]);
   }
 
   static final _addId =
@@ -286,7 +198,7 @@
       _class.instanceMethodId(r'remove', r'(I)Ljava/lang/Object;');
   @override
   $E removeAt(int index) {
-    return _removeAtId(this, E, [JValueInt(index)])!;
+    return _removeAtId(this, JObject.type, [JValueInt(index)])!;
   }
 
   @override
@@ -298,13 +210,204 @@
 
   @override
   JSet<$E> toSet() {
-    return toJSet(E);
+    return toJSet();
+  }
+}
+
+final class _JListView<$E extends JObject?> with ListMixin<$E> {
+  final JList<$E> jlist;
+
+  _JListView(this.jlist);
+
+  static final _class = JClass.forName(r'java/util/List');
+
+  static final _sizeId = _class.instanceMethodId(r'size', r'()I');
+
+  @override
+  int get length => _sizeId(jlist, const jintType(), [])!;
+
+  @override
+  set length(int newLength) {
+    RangeError.checkNotNegative(newLength);
+    while (length < newLength) {
+      add(null as $E);
+    }
+    while (newLength < length) {
+      removeAt(length - 1);
+    }
+  }
+
+  static final _getId =
+      _class.instanceMethodId(r'get', r'(I)Ljava/lang/Object;');
+  @override
+  $E operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return _getId(jlist, JObject.type, [JValueInt(index)]) as $E;
+  }
+
+  static final _setId = _class.instanceMethodId(
+      r'set', r'(ILjava/lang/Object;)Ljava/lang/Object;');
+  @override
+  void operator []=(int index, $E value) {
+    RangeError.checkValidIndex(index, this);
+    _setId(jlist, JObject.type, [JValueInt(index), value]);
+  }
+
+  static final _addId =
+      _class.instanceMethodId(r'add', r'(Ljava/lang/Object;)Z');
+  @override
+  void add($E element) {
+    _addId(jlist, const jbooleanType(), [element]);
+  }
+
+  static final _collectionClass = JClass.forName('java/util/Collection');
+  static final _addAllId =
+      _class.instanceMethodId(r'addAll', r'(Ljava/util/Collection;)Z');
+  @override
+  void addAll(Iterable<$E> iterable) {
+    if (iterable is JObject) {
+      final iterableRef = (iterable as JObject).reference;
+      if (Jni.env.IsInstanceOf(
+          iterableRef.pointer, _collectionClass.reference.pointer)) {
+        _addAllId(jlist, const jbooleanType(), [iterableRef.pointer]);
+        return;
+      }
+    }
+    return super.addAll(iterable);
+  }
+
+  static final _clearId = _class.instanceMethodId(r'clear', r'()V');
+  @override
+  void clear() {
+    _clearId(jlist, const jvoidType(), []);
+  }
+
+  static final _containsId =
+      _class.instanceMethodId(r'contains', r'(Ljava/lang/Object;)Z');
+  @override
+  bool contains(Object? element) {
+    if (element is! JObject?) return false;
+    final elementRef = element?.reference ?? jNullReference;
+    return _containsId(jlist, const jbooleanType(), [elementRef.pointer])!;
+  }
+
+  static final _getRangeId =
+      _class.instanceMethodId(r'subList', r'(II)Ljava/util/List;');
+  @override
+  JList<$E> getRange(int start, int end) {
+    RangeError.checkValidRange(start, end, length);
+    return _getRangeId(jlist, JObject.type, [JValueInt(start), JValueInt(end)])
+        as JList<$E>;
+  }
+
+  static final _indexOfId =
+      _class.instanceMethodId(r'indexOf', r'(Ljava/lang/Object;)I');
+  @override
+  int indexOf(Object? element, [int start = 0]) {
+    if (element is! JObject?) return -1;
+    if (start < 0) start = 0;
+    final elementRef = element?.reference ?? jNullReference;
+    if (start == 0) {
+      return _indexOfId(jlist, const jintType(), [elementRef.pointer])!;
+    }
+    return _indexOfId(
+      getRange(start, length),
+      const jintType(),
+      [elementRef.pointer],
+    )!;
+  }
+
+  static final _insertId =
+      _class.instanceMethodId(r'add', r'(ILjava/lang/Object;)V');
+  @override
+  void insert(int index, $E element) {
+    _insertId(jlist, const jvoidType(), [JValueInt(index), element]);
+  }
+
+  static final _insertAllId =
+      _class.instanceMethodId(r'addAll', r'(ILjava/util/Collection;)Z');
+  @override
+  void insertAll(int index, Iterable<$E> iterable) {
+    if (iterable is JObject) {
+      final iterableRef = (iterable as JObject).reference;
+      if (Jni.env.IsInstanceOf(
+          iterableRef.pointer, _collectionClass.reference.pointer)) {
+        _insertAllId(
+          this,
+          const jbooleanType(),
+          [JValueInt(index), iterableRef.pointer],
+        );
+        return;
+      }
+    }
+    super.insertAll(index, iterable);
+  }
+
+  static final _isEmptyId = _class.instanceMethodId(r'isEmpty', r'()Z');
+  @override
+  bool get isEmpty => _isEmptyId(jlist, const jbooleanType(), [])!;
+
+  @override
+  bool get isNotEmpty => !isEmpty;
+
+  static final _iteratorId =
+      _class.instanceMethodId(r'iterator', r'()Ljava/util/Iterator;');
+  @override
+  JIterator<$E> get iterator =>
+      _iteratorId(jlist, $JIterator$Type$<$E>(E), [])!;
+
+  static final _lastIndexOfId =
+      _class.instanceMethodId(r'lastIndexOf', r'(Ljava/lang/Object;)I');
+  @override
+  int lastIndexOf(Object? element, [int? start]) {
+    if (element is! JObject?) return -1;
+    if (start == null || start >= length) start = length - 1;
+    final elementRef = element?.reference ?? jNullReference;
+    if (start == length - 1) {
+      return _lastIndexOfId(jlist, const jintType(), [elementRef.pointer]);
+    }
+    final range = getRange(0, start);
+    final res = _lastIndexOfId(
+      range,
+      const jintType(),
+      [elementRef.pointer],
+    );
+    range.release();
+    return res;
+  }
+
+  static final _removeId =
+      _class.instanceMethodId(r'remove', r'(Ljava/lang/Object;)Z');
+  @override
+  bool remove(Object? element) {
+    if (element is! JObject?) return false;
+    final elementRef = element?.reference ?? jNullReference;
+    return _removeId(jlist, const jbooleanType(), [elementRef.pointer]);
+  }
+
+  static final _removeAtId =
+      _class.instanceMethodId(r'remove', r'(I)Ljava/lang/Object;');
+  @override
+  $E removeAt(int index) {
+    return _removeAtId(jlist, JObject.type, [JValueInt(index)])!;
+  }
+
+  @override
+  void removeRange(int start, int end) {
+    final range = getRange(start, end);
+    range.clear();
+    range.release();
+  }
+
+  @override
+  JSet<$E> toSet() {
+    return toJSet();
   }
 }
 
 extension ToJavaList<E extends JObject?> on Iterable<E> {
-  JList<E> toJList(JType<E> type) {
-    final list = JList.array(type);
+  JList<E> toJList() {
+    final list = JList<E>.array();
     list.addAll(this);
     return list;
   }
diff --git a/pkgs/jni/lib/src/util/util.dart b/pkgs/jni/lib/src/util/util.dart
index 2509b63..858f29a 100644
--- a/pkgs/jni/lib/src/util/util.dart
+++ b/pkgs/jni/lib/src/util/util.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-export 'jiterator.dart' hide $JIterator$NullableType$, $JIterator$Type$;
-export 'jlist.dart' hide $JList$NullableType$, $JList$Type$;
+export 'jiterator.dart' hide $JIterator$Type$;
+export 'jlist.dart' hide $JList$Type$;
 export 'jmap.dart' hide $JMap$NullableType$, $JMap$Type$;
 export 'jset.dart' hide $JSet$NullableType$, $JSet$Type$;
diff --git a/pkgs/jni/pubspec.yaml b/pkgs/jni/pubspec.yaml
index 929d861..f83c520 100644
--- a/pkgs/jni/pubspec.yaml
+++ b/pkgs/jni/pubspec.yaml
@@ -21,6 +21,7 @@
 
 dependencies:
   args: ^2.5.0
+  collection: ^1.19.1
   ffi: ^2.1.3
   meta: ^1.15.0
   package_config: ^2.1.0
@@ -29,6 +30,7 @@
 
 dev_dependencies:
   dart_flutter_team_lints: ^3.5.2
+  dart_style: ^3.1.2
   ffigen:
     path: ../ffigen
   jnigen:
diff --git a/pkgs/jni/test/boxed_test.dart b/pkgs/jni/test/boxed_test.dart
index d61938d..d1f30dd 100644
--- a/pkgs/jni/test/boxed_test.dart
+++ b/pkgs/jni/test/boxed_test.dart
@@ -79,68 +79,4 @@
       expect(JBoolean(true).booleanValue(releaseOriginal: true), true);
     });
   });
-  testRunner('JByte.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JByte(1)..releasedBy(arena);
-      final b = JByte(2)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JCharacter.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JCharacter(1)..releasedBy(arena);
-      final b = JCharacter(2)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JShort.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JShort(1)..releasedBy(arena);
-      final b = JShort(2)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JInteger.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JInteger(1)..releasedBy(arena);
-      final b = JInteger(2)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JLong.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JLong(1)..releasedBy(arena);
-      final b = JLong(2)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JFloat.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JFloat(1.0)..releasedBy(arena);
-      final b = JFloat(2.0)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JDouble.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JDouble(1.0)..releasedBy(arena);
-      final b = JDouble(2.0)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
-  testRunner('JBoolean.\$type hashCode and ==', () {
-    using((arena) {
-      final a = JBoolean(true)..releasedBy(arena);
-      final b = JBoolean(false)..releasedBy(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-    });
-  });
 }
diff --git a/pkgs/jni/test/exception_test.dart b/pkgs/jni/test/exception_test.dart
index ba3123f..ee65a08 100644
--- a/pkgs/jni/test/exception_test.dart
+++ b/pkgs/jni/test/exception_test.dart
@@ -38,7 +38,7 @@
 
 void run({required TestRunnerCallback testRunner}) {
   JObject newRandom(JClass randomClass) {
-    return randomClass.constructorId('()V').call(randomClass, JObject.type, []);
+    return randomClass.constructorId('()V').call<JObject>(randomClass, []);
   }
 
   testRunner('double free throws exception', () {
diff --git a/pkgs/jni/test/jarray_test.dart b/pkgs/jni/test/jarray_test.dart
index a3ffa47..2ac3f77 100644
--- a/pkgs/jni/test/jarray_test.dart
+++ b/pkgs/jni/test/jarray_test.dart
@@ -158,7 +158,7 @@
     using((arena) {
       final array = JShortArray(3)..releasedBy(arena);
       var counter = 0;
-      for (final element in array) {
+      for (final element in array.asDartList) {
         expect(element, array[counter]);
         ++counter;
       }
diff --git a/pkgs/jni/test/jbyte_buffer_test.dart b/pkgs/jni/test/jbyte_buffer_test.dart
index 666479d..a0ef22c 100644
--- a/pkgs/jni/test/jbyte_buffer_test.dart
+++ b/pkgs/jni/test/jbyte_buffer_test.dart
@@ -195,22 +195,6 @@
     });
   });
 
-  testRunner('type hashCode, ==', () {
-    using((arena) {
-      final a = testDataBuffer(arena);
-      final b = testDataBuffer(arena);
-      expect(a.$type, b.$type);
-      expect(a.$type.hashCode, b.$type.hashCode);
-      final c = JBuffer.fromReference(a.reference);
-      final d = JBuffer.fromReference(b.reference);
-      expect(c.$type, d.$type);
-      expect(c.$type.hashCode, d.$type.hashCode);
-
-      expect(a.$type, isNot(c.$type));
-      expect(a.$type.hashCode, isNot(c.$type.hashCode));
-    });
-  });
-
   testRunner('asUint8List releasing original', () {
     using((arena) {
       // Used as an example in [JByteBuffer].
diff --git a/pkgs/jni/tool/generate_jni_bindings.dart b/pkgs/jni/tool/generate_jni_bindings.dart
index bd334d9..a0bf91a 100644
--- a/pkgs/jni/tool/generate_jni_bindings.dart
+++ b/pkgs/jni/tool/generate_jni_bindings.dart
@@ -6,8 +6,21 @@
 
 import 'package:jnigen/jnigen.dart';
 
-void main() {
-  generateJniBindings(
+Future<void> main() async {
+  // final classes = [
+  //   'java.util.List',
+  //   'java.util.Iterator',
+  // ];
+  // await generateJniBindings(
+  //   Config(
+  //     outputConfig: OutputConfig(
+  //         dartConfig:
+  //             DartCodeOutputConfig(path: Uri.directory('lib/core_bindings'))),
+  //     classes: classes,
+  //     hide: classes,
+  //   ),
+  // );
+  await generateJniBindings(
     Config(
       androidSdkConfig: AndroidSdkConfig(
         addGradleDeps: true,
diff --git a/pkgs/jni/tool/generate_primitive_arrays.dart b/pkgs/jni/tool/generate_primitive_arrays.dart
new file mode 100644
index 0000000..e673b34
--- /dev/null
+++ b/pkgs/jni/tool/generate_primitive_arrays.dart
@@ -0,0 +1,194 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Generates lib/src/primitive_jarrays.dart.
+
+import 'dart:io';
+
+import 'package:dart_style/dart_style.dart';
+
+class PrimitiveType {
+  final String name;
+  final String signature;
+  final String dartType;
+  final int size;
+  final bool isUnsigned;
+
+  const PrimitiveType(
+    this.name,
+    this.signature, {
+    required this.dartType,
+    required this.size,
+    this.isUnsigned = false,
+  });
+
+  String get nativeDartListType {
+    if (dartType == 'double') {
+      return 'Float${size}List';
+    }
+    return '${isUnsigned ? 'Uint' : 'Int'}${size}List';
+  }
+
+  String get nativeDartType {
+    if (dartType == 'double') {
+      return size == 32 ? 'Float' : 'Double';
+    }
+    return '${isUnsigned ? 'Uint' : 'Int'}$size';
+  }
+
+  String get sizeInDoc => size == 8 ? 'eight' : '$size';
+
+  int get lowestInRange {
+    if (isUnsigned) {
+      return 0;
+    }
+    return -(1 << (size - 1));
+  }
+
+  int get highestInRange {
+    if (isUnsigned) {
+      return (1 << size) - 1;
+    }
+    return (1 << (size - 1)) - 1;
+  }
+}
+
+void main() {
+  final outputUri =
+      Platform.script.resolve('../lib/src/primitive_jarrays.dart');
+  final outputFile = File.fromUri(outputUri);
+  final s = StringBuffer();
+  s.writeln('''
+// AUTO GENERATED. DO NOT EDIT!
+// 
+// To regenerate, run `dart run tool/generate_primtive_arrays.dart`
+
+part of 'jarray.dart';
+''');
+  const primitiveTypes = [
+    PrimitiveType('Boolean', 'Z', dartType: 'bool', size: 8, isUnsigned: true),
+    PrimitiveType('Byte', 'B', dartType: 'int', size: 8),
+    PrimitiveType('Char', 'C', dartType: 'int', size: 16, isUnsigned: true),
+    PrimitiveType('Short', 'S', dartType: 'int', size: 16),
+    PrimitiveType('Int', 'I', dartType: 'int', size: 32),
+    PrimitiveType('Long', 'J', dartType: 'int', size: 64),
+    PrimitiveType('Float', 'F', dartType: 'double', size: 32),
+    PrimitiveType('Double', 'D', dartType: 'double', size: 64),
+  ];
+  for (final type in primitiveTypes) {
+    final typeName = type.name;
+    final arrayName = 'J${typeName}Array';
+    s.write('''
+final class _\$$arrayName\$Type\$ extends JType<$arrayName> {
+  const _\$$arrayName\$Type\$();
+
+  @override
+  String get signature => '[${type.signature}';
+}
+
+/// A fixed-length array of Java $typeName.
+///
+''');
+    if (type.dartType == 'int') {
+      s.write('''
+/// Integers stored in the list are truncated to their low ${type.sizeInDoc} bits
+''');
+      if (type.isUnsigned) {
+        s.write('''
+/// interpreted as an unsigned ${type.size}-bit integer with values in the
+/// range ${type.lowestInRange} to +${type.highestInRange}.
+///
+''');
+      } else {
+        s.write('''
+/// interpreted as a signed ${type.size}-bit two's complement integer with values in the
+/// range ${type.lowestInRange} to +${type.highestInRange}.
+///
+''');
+      }
+    }
+    s.write('''
+/// Java equivalent of [${type.nativeDartListType}].
+extension type $arrayName._(JObject _\$this) implements JObject {
+  /// The type which includes information such as the signature of this class.
+  static const JType<$arrayName> type = _\$$arrayName\$Type\$();
+
+  /// Creates a [$arrayName] of the given [length].
+  ///
+  /// The [length] must be a non-negative integer.
+  factory $arrayName(int length) {
+    RangeError.checkNotNegative(length);
+    return JObject.fromReference(
+      JGlobalReference(Jni.env.New${typeName}Array(length)),
+    ) as $arrayName;
+  }
+
+  /// The number of elements in this array.
+  int get length => Jni.env.GetArrayLength(reference.pointer);
+
+  ${type.dartType} operator [](int index) {
+    RangeError.checkValidIndex(index, this);
+    return Jni.env.Get${typeName}ArrayElement(reference.pointer, index);
+  }
+
+  void operator []=(int index, ${type.dartType} value) {
+    RangeError.checkValidIndex(index, this);
+    Jni.env.Set${typeName}ArrayElement(reference.pointer, index, value);
+  }
+
+  ${type.nativeDartListType} getRange(int start, int end, {Allocator allocator = malloc}) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    final buffer = allocator<${type.nativeDartType}>(rangeLength);
+    Jni.env
+        .Get${typeName}ArrayRegion(reference.pointer, start, rangeLength, buffer);
+    return buffer.asTypedList(rangeLength, finalizer: allocator._nativeFree);
+  }
+
+  void setRange(int start, int end, Iterable<${type.dartType}> iterable,
+      [int skipCount = 0]) {
+    RangeError.checkValidRange(start, end, length);
+    final rangeLength = end - start;
+    _allocate<${type.nativeDartType}>(sizeOf<${type.nativeDartType}>() * rangeLength, (ptr) {
+      ptr
+          .asTypedList(rangeLength)
+          .setRange(0, rangeLength, iterable${typeName == 'Boolean' ? '.map((e) => e ? 1 : 0)' : ''}, skipCount);
+      Jni.env.Set${typeName}ArrayRegion(reference.pointer, start, rangeLength, ptr);
+    });
+  }
+}
+
+final class _${arrayName}ListView
+    with ListMixin<${type.dartType}>, NonGrowableListMixin<${type.dartType}> {
+  final $arrayName _jarray;
+
+  _${arrayName}ListView(this._jarray);
+
+  @override
+  int get length => _jarray.length;
+
+  @override
+  ${type.dartType} operator [](int index) {
+    return _jarray[index];
+  }
+
+  @override
+  void operator []=(int index, ${type.dartType} value) {
+    _jarray[index] = value;
+  }
+}
+
+extension ${arrayName}ToList on $arrayName {
+  /// Returns a [List] view into this array.
+  ///
+  /// Any changes to this list will reflect in the original array as well.
+  List<${type.dartType}> get asDartList => _${arrayName}ListView(this);
+}
+
+''');
+    final formatter = DartFormatter(
+        languageVersion: DartFormatter.latestShortStyleLanguageVersion);
+    outputFile.writeAsStringSync(formatter.format(s.toString()));
+  }
+}
diff --git a/pkgs/jnigen/lib/src/bindings/dart_generator.dart b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
index d92ed11..b0c9d1b 100644
--- a/pkgs/jnigen/lib/src/bindings/dart_generator.dart
+++ b/pkgs/jnigen/lib/src/bindings/dart_generator.dart
@@ -29,7 +29,6 @@
 // package:jni types.
 const _jType = '$_jni.JType';
 const _jPointer = '$_jni.JObjectPtr';
-const _jReference = '$_jni.JReference';
 const _jGlobalReference = '$_jni.JGlobalReference';
 const _jArray = '$_jni.JArray';
 const _jArrayTypePrefix = '$_jni.\$JArray\$';
@@ -85,33 +84,6 @@
   return '\n${'  ' * depth}';
 }
 
-/// Merges two maps. For the same keys, their value lists will be concatenated.
-///
-/// ** After calling this, the original maps might get modified! **
-Map<K, List<V>> _mergeMapValues<K, V>(Map<K, List<V>> a, Map<K, List<V>> b) {
-  final merged = <K, List<V>>{};
-  for (final key in {...a.keys, ...b.keys}) {
-    if (!a.containsKey(key)) {
-      merged[key] = b[key]!;
-      continue;
-    }
-    if (!b.containsKey(key)) {
-      merged[key] = a[key]!;
-      continue;
-    }
-
-    // Merging the smaller one to the bigger one
-    if (a[key]!.length > b[key]!.length) {
-      merged[key] = a[key]!;
-      merged[key]!.addAll(b[key]!);
-    } else {
-      merged[key] = b[key]!;
-      merged[key]!.addAll(a[key]!);
-    }
-  }
-  return merged;
-}
-
 /// **Naming Convention**
 ///
 /// Let's take the following code as an example:
@@ -313,9 +285,6 @@
 
   _ClassGenerator(this.config, this.s, this.resolver);
 
-  static const staticTypeGetter = 'type';
-  static const instanceTypeGetter = '\$$staticTypeGetter';
-
   void generateFieldsAndMethods(ClassDecl node, String classRef) {
     final fieldGenerator = _FieldGenerator(
       config,
@@ -377,87 +346,20 @@
         .map((typeParam) => '$_typeParamPrefix$typeParam')
         .join(', ')
         .encloseIfNotEmpty('<', '>');
-    final staticTypeGetterCallArgs =
-        typeParams.join(', ').encloseIfNotEmpty('(', ')');
-    final typeClassesDef = typeParams
-        .map(
-          (typeParam) => '''
-  $_internal
-  final $_jType<$_typeParamPrefix$typeParam> $typeParam;
-''',
-        )
-        .join('\n');
-    final ctorTypeClassesDef = typeParams
-        .map((typeParam) => 'this.$typeParam,')
-        .join(_newLine(depth: 2));
-    final superClass = node.classDecl.superclass! as DeclaredType;
-    final superTypeClassesCall = superClass.classDecl.isObject
-        ? ''
-        : superClass.params
-            .accept(_TypeClassGenerator(resolver))
-            .map((typeClass) => '${typeClass.name},')
-            .join(_newLine(depth: 2));
     s.write('''
-class $name$typeParamsDef extends $superName {
-  $_internal
-  $_override
-  final $_jType<$name$typeParamsCall> $instanceTypeGetter;
-
-  $typeClassesDef
-
-  $_internal
-  $name.fromReference(
-    $ctorTypeClassesDef
-    $_jReference reference,
-  ) :
-    $instanceTypeGetter = $staticTypeGetter$typeParamsCall$staticTypeGetterCallArgs,
-    super.fromReference(
-      $superTypeClassesCall
-      reference
-    );
-
+extension type $name$typeParamsDef._($_jObject _\$this) implements $superName {
 ''');
 
     final classRef = writeClassRef(node);
 
     // Static TypeClass getter.
-    void generateTypeClassGetter({required bool isNullable}) {
-      s.writeln(
-        '  /// The type which includes information such as the signature of this class.',
-      );
-      final typeClassName =
-          isNullable ? node.nullableTypeClassName : node.typeClassName;
-      final typeClassGetterName =
-          isNullable ? 'nullableType' : staticTypeGetter;
-      final questionMark = isNullable ? '?' : '';
-      if (typeParams.isEmpty) {
-        s.write('''
-  static const $_jType<$name$typeParamsCall$questionMark> $typeClassGetterName = $typeClassName$typeParamsCall();
-''');
-      } else {
-        final staticTypeGetterTypeClassesDef = typeParams
-            .map(
-              (typeParam) => '$_jType<$_typeParamPrefix$typeParam> $typeParam,',
-            )
-            .join(_newLine(depth: 2));
-        final typeClassesCall = typeParams
-            .map((typeParam) => '$typeParam,')
-            .join(_newLine(depth: 3));
-        s.write('''
-  static $_jType<$name$typeParamsCall$questionMark> $typeClassGetterName$typeParamsDef(
-    $staticTypeGetterTypeClassesDef
-  ) {
-    return $typeClassName$typeParamsCall(
-      $typeClassesCall
+    s.writeln(
+      '  /// The type which includes information such as the signature of this class.',
     );
-  }
-
+    final typeClassName = node.typeClassName;
+    s.write('''
+  static const $_jType<$name> type = $typeClassName();
 ''');
-      }
-    }
-
-    generateTypeClassGetter(isNullable: true);
-    generateTypeClassGetter(isNullable: false);
 
     // Fields and Methods
     generateFieldsAndMethods(node, classRef);
@@ -555,16 +457,10 @@
     $implClassName$typeParamsCall \$impl,
   ) {
 ''');
-      final typeClassesCall = typeParams
-          .map((typeParam) => '\$impl.$typeParam,')
-          .join(_newLine(depth: 3));
       s.write('''
     final \$i = $_jni.JImplementer();
     implementIn(\$i, \$impl);
-    return $name$typeParamsCall.fromReference(
-      $typeClassesCall
-      \$i.implementReference(),
-    );
+    return \$i.implement<$name$typeParamsCall>();
   }
   ''');
     }
@@ -581,26 +477,16 @@
     // Used for interface implementation.
     if (node.declKind == DeclKind.interfaceKind) {
       // Abstract Impl class.
-      final typeClassGetters = typeParams
-          .map(
-            (typeParam) =>
-                '$_jType<$_typeParamPrefix$typeParam> get $typeParam;',
-          )
-          .join(_newLine(depth: 1));
-      final abstractFactoryArgs = [
-        ...typeParams.map(
-          (typeParam) => 'required $_jType<\$$typeParam> $typeParam,',
-        ),
-        ...node.methods.accept(_AbstractImplFactoryArg(resolver)),
-      ].join(_newLine(depth: 2)).encloseIfNotEmpty('{', '}');
+      final abstractFactoryArgs = node.methods
+          .accept(_AbstractImplFactoryArg(resolver))
+          .join(_newLine(depth: 2))
+          .encloseIfNotEmpty('{', '}');
       s.write('''
 abstract base mixin class $implClassName$typeParamsDef {
   factory $implClassName(
     $abstractFactoryArgs
   ) = _$implClassName$typeParamsCall;
 
-  $typeClassGetters
-
 ''');
       final abstractImplMethod = _AbstractImplMethod(resolver, s);
       for (final method in node.methods) {
@@ -610,22 +496,14 @@
 
       // Concrete Impl class.
       // This is for passing closures instead of implementing the class.
-      final concreteCtorArgs = [
-        ...typeParams.map((typeParam) => 'required this.$typeParam,'),
-        ...node.methods.accept(_ConcreteImplClosureCtorArg(resolver)),
-      ].join(_newLine(depth: 2)).encloseIfNotEmpty('{', '}');
+      final concreteCtorArgs = node.methods
+          .accept(_ConcreteImplClosureCtorArg(resolver))
+          .join(_newLine(depth: 2))
+          .encloseIfNotEmpty('{', '}');
       final setClosures = node.methods
           .map((method) => '_${method.finalName} = ${method.finalName}')
           .join(', ')
           .encloseIfNotEmpty(' :  ', '');
-      final typeClassesDef = typeParams
-          .map(
-            (typeParam) => '''
-$_override
-final $_jType<\$$typeParam> $typeParam;
-''',
-          )
-          .join(_newLine(depth: 1));
       s.write('''
 
 final class _$implClassName$typeParamsDef with $implClassName$typeParamsCall {
@@ -633,8 +511,6 @@
     $concreteCtorArgs
   )$setClosures;
 
-  $typeClassesDef
-
 ''');
       final concreteClosureDef = _ConcreteImplClosureDef(resolver, s);
       for (final method in node.methods) {
@@ -648,99 +524,18 @@
       s.writeln('}');
     }
     // TypeClass definition.
-    void generateTypeClass({required bool isNullable}) {
-      final typeClassName =
-          isNullable ? node.nullableTypeClassName : node.typeClassName;
-      final typeClassesCall =
-          typeParams.map((typeParam) => '$typeParam,').join(_newLine(depth: 2));
-      final signature = node.signature;
-      final superType = superClass.accept(_TypeClassGenerator(resolver)).name;
-      final hashCodeTypeClasses = typeParams.join(', ');
-      final equalityTypeClasses = typeParams
-          .map((typeParam) => ' &&\n        $typeParam == other.$typeParam')
-          .join();
-      final hashCode = typeParams.isEmpty
-          ? '($typeClassName).hashCode'
-          : 'Object.hash($typeClassName, $hashCodeTypeClasses)';
-      final nullableType = isNullable
-          ? 'this'
-          : (DeclaredType(
-              binaryName: node.binaryName,
-              annotations: [Annotation.nullable],
-              params: node.allTypeParams
-                  .map(
-                    (typeParam) => TypeVar(name: typeParam.name)
-                      ..origin = TypeParam(
-                        name: typeParam.name,
-                        annotations: [Annotation.nonNull],
-                        bounds: typeParam.bounds,
-                      ),
-                  )
-                  .toList(),
-            )..classDecl = node)
-              .accept(_TypeClassGenerator(resolver))
-              .name;
-      final nullable = isNullable ? '?' : '';
-      s.write('''
-final class $typeClassName$typeParamsDef extends $_jType<$name$typeParamsCall$nullable> {
-  $typeClassesDef
-
+    final signature = node.signature;
+    s.write('''
+final class $typeClassName extends $_jType<$name> {
   $_internal
-  const $typeClassName(
-    $ctorTypeClassesDef
-  );
+  const $typeClassName();
 
   $_internal
   $_override
   String get signature => r'$signature';
-
-  $_internal
-  $_override
-  $name$typeParamsCall$nullable fromReference($_jReference reference) =>
-  ''');
-      if (isNullable) {
-        s.write('''
-    reference.isNull ? null : $name$typeParamsCall.fromReference(
-      $typeClassesCall
-      reference,
-    );
-''');
-      } else {
-        s.write('''
-    $name$typeParamsCall.fromReference(
-      $typeClassesCall
-      reference,
-    );
-''');
-      }
-      s.write('''
-  $_internal
-  $_override
-  $_jType get superType => $superType;
-
-  $_internal
-  $_override
-  $_jType<$name$typeParamsCall?> get nullableType => $nullableType;
-
-  $_internal
-  $_override
-  final superCount = ${node.superCount};
-
-  $_override
-  int get hashCode => $hashCode;
-
-  $_override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($typeClassName$typeParamsCall) &&
-        other is $typeClassName$typeParamsCall$equalityTypeClasses;
-  }
 }
 
 ''');
-    }
-
-    generateTypeClass(isNullable: true);
-    generateTypeClass(isNullable: false);
 
     log.finest('Generated bindings for class ${node.binaryName}');
   }
@@ -787,6 +582,10 @@
 
   final bool forInterfaceImplementation;
 
+  /// Whether or not to return the equivalent boxed type class for primitives.
+  /// Only for interface implemetation.
+  final bool boxPrimitives;
+
   /// Whether the generic types should be erased.
   final bool typeErasure;
 
@@ -798,6 +597,7 @@
   const _TypeGenerator(
     this.resolver, {
     this.forInterfaceImplementation = false,
+    this.boxPrimitives = false,
     this.typeErasure = false,
     this.includeNullability = true,
     this.arrayType = false,
@@ -855,7 +655,10 @@
     if (arrayType) {
       return node.name.capitalize();
     }
-    return node.dartType;
+    if (node.name == 'void') {
+      return 'void';
+    }
+    return boxPrimitives ? '$_jni.J${node.boxedName}' : node.dartType;
   }
 
   @override
@@ -903,17 +706,8 @@
   }
 }
 
-class _TypeClass {
-  final String name;
-  final bool canBeConst;
-
-  const _TypeClass(this.name, this.canBeConst);
-}
-
 /// Generates the type class.
-class _TypeClassGenerator extends TypeVisitor<_TypeClass> {
-  final bool isConst;
-
+class _TypeClassGenerator extends TypeVisitor<String> {
   /// Whether the top-type of the current type being visited is nullable.
   ///
   /// For example the top-type of `T` in `Foo<T extends Bar>` is `Bar`, this
@@ -937,7 +731,6 @@
 
   _TypeClassGenerator(
     this.resolver, {
-    this.isConst = true,
     this.boxPrimitives = false,
     this.forInterfaceImplementation = false,
     this.includeNullability = true,
@@ -946,11 +739,10 @@
   });
 
   @override
-  _TypeClass visitArrayType(ArrayType node) {
+  String visitArrayType(ArrayType node) {
     final innerTypeClass = node.elementType.accept(
       _TypeClassGenerator(
         resolver,
-        isConst: false,
         boxPrimitives: false,
         forInterfaceImplementation: forInterfaceImplementation,
         // Do type erasure for interface implementation.
@@ -968,115 +760,32 @@
         isTopTypeNullable: true,
       ),
     );
-    final ifConst = innerTypeClass.canBeConst && isConst ? 'const ' : '';
-    final type = includeNullability && node.isNullable && isTopTypeNullable
-        ? 'NullableType'
-        : 'Type';
     if (node.elementType is PrimitiveType) {
-      return _TypeClass(
-        '$ifConst$_jni.\$J${innerType}Array\$$type\$()',
-        innerTypeClass.canBeConst,
-      );
+      return '$_jni.\$J${innerType}Array\$Type\$()';
     }
-    return _TypeClass(
-      '$ifConst$_jArrayTypePrefix$type\$<$innerType>(${innerTypeClass.name})',
-      innerTypeClass.canBeConst,
-    );
+    return '${_jArrayTypePrefix}Type\$<$innerType>($innerTypeClass)';
   }
 
   @override
-  _TypeClass visitDeclaredType(DeclaredType node) {
+  String visitDeclaredType(DeclaredType node) {
     if (node.classDecl.isObject) {
       // The class is not generated, fall back to `JObject`.
       return super.visitDeclaredType(node);
     }
-    final allTypeClasses = node.mapTypeParameters(
-      (isNullable, definedType) {
-        return definedType.accept(_TypeClassGenerator(
-          resolver,
-          isConst: false,
-          boxPrimitives: false,
-          forInterfaceImplementation: forInterfaceImplementation,
-          typeErasure: forInterfaceImplementation,
-          isTopTypeNullable: isNullable,
-        ));
-      },
-    );
-
-    // Can be const if all the type parameters are defined and each of them are
-    // also const.
-    final canBeConst = allTypeClasses.every((e) => e.canBeConst);
-
-    // Add const to subexpressions if the entire expression is not const.
-    final allTypeParams = allTypeClasses
-        .map((typeClass) =>
-            '${typeClass.canBeConst && !canBeConst ? 'const ' : ''}'
-            '${typeClass.name}')
-        .toList();
-
-    final args = allTypeParams.join(', ');
-    final ifConst = isConst && canBeConst ? 'const ' : '';
-    final type = includeNullability && node.isNullable && isTopTypeNullable
-        ? node.classDecl.nullableTypeClassName
-        : node.classDecl.typeClassName;
-
-    final typeArgsList = node.mapTypeParameters(
-      (isNullable, definedType) {
-        return definedType.accept(
-          _TypeGenerator(
-            resolver,
-            forInterfaceImplementation: forInterfaceImplementation,
-            // Do type erasure for interface implementation.
-            typeErasure: forInterfaceImplementation,
-            isTopTypeNullable: isNullable,
-          ),
-        );
-      },
-    );
-    final typeArgs = typeArgsList.join(', ').encloseIfNotEmpty('<', '>');
+    final type = node.classDecl.finalName;
     final prefix = resolver.resolvePrefix(node.classDecl);
-    return _TypeClass('$ifConst$prefix$type$typeArgs($args)', canBeConst);
+    return '$prefix$type.type';
   }
 
   @override
-  _TypeClass visitPrimitiveType(PrimitiveType node) {
-    final ifConst = isConst ? 'const ' : '';
-    final name = boxPrimitives
-        ? '$_jni.\$J${node.boxedName}\$Type\$'
-        : '$_jni.j${node.name}Type';
-    return _TypeClass('$ifConst$name()', true);
+  String visitPrimitiveType(PrimitiveType node) {
+    return boxPrimitives
+        ? '$_jni.J${node.boxedName}.type'
+        : '$_jni.j${node.name}.type';
   }
 
   @override
-  _TypeClass visitTypeVar(TypeVar node) {
-    // TODO(https://github.com/dart-lang/native/issues/704): Tighten to typevar
-    // bounds instead.
-    final type = includeNullability && node.hasQuestionMark && isTopTypeNullable
-        ? 'NullableType'
-        : 'Type';
-    final convertToNullable =
-        includeNullability && node.hasQuestionMark && isTopTypeNullable
-            ? '.nullableType'
-            : '';
-    if (typeErasure) {
-      final ifConst = isConst ? 'const ' : '';
-      return _TypeClass('$ifConst$_jObjectTypePrefix$type\$()', true);
-    }
-    if (forInterfaceImplementation) {
-      if (node.origin.parent is ClassDecl) {
-        return _TypeClass(
-          '_\$impls[\$p]!.${node.name}$convertToNullable',
-          false,
-        );
-      }
-      final ifConst = isConst ? 'const ' : '';
-      return _TypeClass('$ifConst$_jObjectTypePrefix$type\$()', true);
-    }
-    return _TypeClass('${node.name}$convertToNullable', false);
-  }
-
-  @override
-  _TypeClass visitWildcard(Wildcard node) {
+  String visitWildcard(Wildcard node) {
     // TODO(https://github.com/dart-lang/native/issues/701): Support wildcards.
     if (node.superBound != null || node.extendsBound == null) {
       // Dart does not support `* super T` wildcards. Fall back to Object?.
@@ -1088,7 +797,6 @@
       forInterfaceImplementation: forInterfaceImplementation,
       includeNullability:
           includeNullability && node.isNullable && isTopTypeNullable,
-      isConst: isConst,
       typeErasure: typeErasure,
       isTopTypeNullable: true,
     );
@@ -1096,12 +804,8 @@
   }
 
   @override
-  _TypeClass visitNonPrimitiveType(ReferredType node) {
-    final ifConst = isConst ? 'const ' : '';
-    final type = includeNullability && node.isNullable && isTopTypeNullable
-        ? 'NullableType'
-        : 'Type';
-    return _TypeClass('$ifConst$_jObjectTypePrefix$type\$()', true);
+  String visitNonPrimitiveType(ReferredType node) {
+    return '$_jObjectTypePrefix$Type\$()';
   }
 }
 
@@ -1132,9 +836,8 @@
 
   @override
   String visitNonPrimitiveType(ReferredType node) {
-    final typeClass = node.accept(_TypeClassGenerator(resolver)).name;
     final type = node.accept(_TypeGenerator(resolver));
-    return 'object<$type>($typeClass)';
+    return 'object<$type>()';
   }
 }
 
@@ -1208,18 +911,30 @@
 ''');
   }
 
-  String dartOnlyGetter(Field node) {
+  String getter(Field node) {
     final name = node.finalName;
     final self = node.isStatic ? classRef : _self;
-    final type = node.type.accept(_TypeClassGenerator(resolver)).name;
-    return '_id_$name.get($self, $type)';
+    final String typeClass;
+    if (node.type is PrimitiveType) {
+      typeClass = node.type.accept(_TypeClassGenerator(resolver));
+    } else {
+      typeClass = 'const $_jObjectTypePrefix'
+          '${node.isNullable ? 'NullableType\$' : 'Type\$'}()';
+    }
+    return '_id_$name.get($self, $typeClass)';
   }
 
-  String dartOnlySetter(Field node) {
+  String setter(Field node) {
     final name = node.finalName;
     final self = node.isStatic ? classRef : _self;
-    final type = node.type.accept(_TypeClassGenerator(resolver)).name;
-    return '_id_$name.set($self, $type, value)';
+    final String typeClass;
+    if (node.type is PrimitiveType) {
+      typeClass = node.type.accept(_TypeClassGenerator(resolver));
+    } else {
+      typeClass = 'const $_jObjectTypePrefix'
+          '${node.isNullable ? 'NullableType\$' : 'Type\$'}()';
+    }
+    return '_id_$name.set($self, $typeClass, value)';
   }
 
   void writeDocs(Field node, {required bool writeReleaseInstructions}) {
@@ -1254,14 +969,14 @@
     final ifStatic = node.isStatic && !isTopLevel ? 'static ' : '';
     final type = node.type.accept(_TypeGenerator(resolver));
     s.write('$ifStatic$type get $name => ');
-    s.write(dartOnlyGetter(node));
+    s.write(getter(node));
     s.writeln(';\n');
     if (!node.isFinal) {
       // Setter docs.
       writeDocs(node, writeReleaseInstructions: true);
 
       s.write('${ifStatic}set $name($type value) => ');
-      s.write(dartOnlySetter(node));
+      s.write(setter(node));
       s.writeln(';\n');
     }
   }
@@ -1348,7 +1063,12 @@
       '_id_$name as $_jni.JMethodIDPtr',
       ...node.params.accept(const _ParamCall()),
     ].join(', ');
-    return '_$name($params).reference';
+    final typeParamsCall = node.classDecl.allTypeParams
+        .map((typeParam) => '$_typeParamPrefix${typeParam.name}')
+        .join(', ')
+        .encloseIfNotEmpty('<', '>');
+    return '_$name($params).object'
+        '<${node.classDecl.finalName}$typeParamsCall>()';
   }
 
   String methodCall(Method node) {
@@ -1383,27 +1103,6 @@
     }
     node.javadoc?.accept(_DocGenerator(s, depth: 1));
 
-    // Used for inferring the type parameter from the given parameters.
-    final typeLocators = node.params
-        .accept(_ParamTypeLocator(resolver: resolver))
-        .fold(<String, List<String>>{}, _mergeMapValues).map(
-      (key, value) =>
-          MapEntry(key, value.delimited(', ').encloseIfNotEmpty('[', ']')),
-    );
-
-    bool isRequired(TypeParam typeParam) {
-      return (typeLocators[typeParam.name] ?? '').isEmpty;
-    }
-
-    final typeInference =
-        (node.isConstructor ? node.classDecl.allTypeParams : node.typeParams)
-            .where((tp) => !isRequired(tp))
-            .map((tp) => tp.name)
-            .map(
-              (tp) => '$tp ??= $_jni.lowestCommonSuperType'
-                  '(${typeLocators[tp]}) as $_jType<$_typeParamPrefix$tp>;',
-            )
-            .join(_newLine(depth: 2));
     // This is needed to keep the references alive in the scope while waiting
     // for the FFI call.
     final localReferences = node.params
@@ -1415,31 +1114,11 @@
       final name = node.finalName;
       final ctorName = name == 'new\$' ? className : '$className.$name';
       final paramsDef = node.params.accept(_ParamDef(resolver)).delimited(', ');
-      final typeParamsCall = node.classDecl.allTypeParams
-          .map((typeParam) => '$_typeParamPrefix${typeParam.name}')
-          .join(', ')
-          .encloseIfNotEmpty('<', '>');
-      final typeClassDef = node.classDecl.allTypeParams
-          .map(
-            (typeParam) => typeParam.accept(
-              _CtorTypeClassDef(isRequired: isRequired(typeParam)),
-            ),
-          )
-          .delimited(', ')
-          .encloseIfNotEmpty('{', '}');
-      final typeClassCall = node.classDecl.allTypeParams
-          .map((typeParam) => typeParam.name)
-          .delimited(', ');
-
       final ctorExpr = constructor(node);
       s.write('''
-  factory $ctorName($paramsDef$typeClassDef) {
-    $typeInference
+  factory $ctorName($paramsDef) {
     ${localReferences.join(_newLine(depth: 2))}
-    return ${node.classDecl.finalName}$typeParamsCall.fromReference(
-      $typeClassCall
-      $ctorExpr
-    );
+    return $ctorExpr;
   }
 
 ''');
@@ -1453,14 +1132,6 @@
         : node.returnType.accept(_TypeGenerator(resolver));
     final ifStatic = node.isStatic && !isTopLevel ? 'static ' : '';
     final defArgs = node.params.accept(_ParamDef(resolver)).toList();
-    final typeClassDef = node.typeParams
-        .map(
-          (typeParam) => typeParam.accept(
-            _MethodTypeClassDef(isRequired: isRequired(typeParam)),
-          ),
-        )
-        .delimited(', ')
-        .encloseIfNotEmpty('{', '}');
     final typeParamsDef = node.typeParams
         .accept(const _TypeParamDef())
         .join(', ')
@@ -1470,17 +1141,16 @@
       localReferences.removeLast();
     }
     final params = defArgs.delimited(', ');
-    s.write('  $ifStatic$returnType $name$typeParamsDef($params$typeClassDef)');
+    s.write('  $ifStatic$returnType $name$typeParamsDef($params)');
     final callExpr = methodCall(node);
     if (isSuspendFun(node)) {
       final returningType =
           node.asyncReturnType!.accept(_TypeGenerator(resolver));
       final returningTypeClass =
-          node.asyncReturnType!.accept(_TypeClassGenerator(resolver)).name;
+          node.asyncReturnType!.accept(_TypeClassGenerator(resolver));
       final isNullable = node.asyncReturnType!.isNullable;
       final continuation = node.params.last.finalName;
       s.write('''async {
-    $typeInference
     final \$p = $_jni.ReceivePort();
     final _\$$continuation = $_protectedExtension.newPortContinuation(\$p);
     ${localReferences.join(_newLine(depth: 2))}
@@ -1511,7 +1181,6 @@
     } else {
       final returning = returnType == 'void' ? callExpr : 'return $callExpr';
       s.writeln('''{
-    $typeInference
     ${localReferences.join(_newLine(depth: 2))}
     $returning;
   }
@@ -1581,45 +1250,6 @@
   }
 }
 
-/// Generates the method type param definition.
-///
-/// For example `required JObjType<T> $T` in:
-/// ```dart
-/// void bar(..., {required JObjType<T> $T}) => ...
-/// ```
-class _MethodTypeClassDef extends Visitor<TypeParam, String> {
-  final bool isRequired;
-
-  const _MethodTypeClassDef({required this.isRequired});
-
-  @override
-  String visit(TypeParam node) {
-    return '${isRequired ? 'required ' : ''}$_jType'
-        '<$_typeParamPrefix${node.name}>${isRequired ? '' : '?'} ${node.name}';
-  }
-}
-
-/// Generates the class type param definition. Used only in constructors.
-///
-/// For example `required this.$T` in:
-/// ```dart
-/// class Foo {
-///   final JObjType<T> $T;
-///   Foo(..., {required this.$T}) => ...
-/// }
-/// ```
-class _CtorTypeClassDef extends Visitor<TypeParam, String> {
-  final bool isRequired;
-
-  const _CtorTypeClassDef({required this.isRequired});
-
-  @override
-  String visit(TypeParam node) {
-    return '${isRequired ? 'required ' : ''} $_jType'
-        '<$_typeParamPrefix${node.name}>${isRequired ? '' : '?'} ${node.name}';
-  }
-}
-
 /// Method parameter's definition.
 ///
 /// For example `Foo foo` in:
@@ -1724,112 +1354,6 @@
   }
 }
 
-/// The ways to locate each type parameter.
-///
-/// For example in `JArray<JMap<$T, $T>> a`, `T` can be retreived using
-/// ```dart
-/// ((((a.$type as JArrayType).elementType) as $JMapType).K)
-///   as JObjType<$T>
-/// ```
-/// and
-/// ```dart
-/// ((((a.$type as JArrayType).elementType) as $JMapType).V)
-///   as JObjType<$T>
-/// ```
-class _ParamTypeLocator extends Visitor<Param, Map<String, List<String>>> {
-  final Resolver resolver;
-
-  _ParamTypeLocator({required this.resolver});
-
-  @override
-  Map<String, List<String>> visit(Param node) {
-    if (node.isNullable) {
-      return {};
-    }
-    return node.type.accept(_TypeVarLocator(resolver: resolver)).map(
-          (key, value) => MapEntry(
-            key,
-            value
-                .map(
-                  (e) => (e..appendLeft('${node.finalName}.\$type')).toString(),
-                )
-                .toList(),
-          ),
-        );
-  }
-}
-
-class _TypeVarLocator extends TypeVisitor<Map<String, List<OutsideInBuffer>>> {
-  final Resolver resolver;
-
-  _TypeVarLocator({required this.resolver});
-
-  @override
-  Map<String, List<OutsideInBuffer>> visitNonPrimitiveType(ReferredType node) {
-    return {};
-  }
-
-  @override
-  Map<String, List<OutsideInBuffer>> visitWildcard(Wildcard node) {
-    // TODO(https://github.com/dart-lang/native/issues/701): Support wildcards.
-    if (node.superBound != null || node.extendsBound == null) {
-      // Dart does not support `* super T` wildcards. Fall back to Object?.
-      return super.visitWildcard(node);
-    }
-    return node.extendsBound!.accept(this);
-  }
-
-  @override
-  Map<String, List<OutsideInBuffer>> visitTypeVar(TypeVar node) {
-    return {
-      node.name: [OutsideInBuffer()],
-    };
-  }
-
-  @override
-  Map<String, List<OutsideInBuffer>> visitDeclaredType(DeclaredType node) {
-    if (node.classDecl.isObject) {
-      // The class is not generated, fall back to `JObject`.
-      return super.visitDeclaredType(node);
-    }
-    final offset = node.classDecl.allTypeParams.length - node.params.length;
-    final result = <String, List<OutsideInBuffer>>{};
-    final prefix = resolver.resolvePrefix(node.classDecl);
-    final typeClass = '$prefix${node.classDecl.typeClassName}';
-    final typeClassParams = List.filled(
-      node.classDecl.allTypeParams.length,
-      '$_core.dynamic',
-    ).join(', ').encloseIfNotEmpty('<', '>');
-    for (var i = 0; i < node.params.length; ++i) {
-      final typeParam = node.classDecl.allTypeParams[i + offset].name;
-      final exprs = node.params[i].accept(this);
-      for (final expr in exprs.entries) {
-        for (final buffer in expr.value) {
-          buffer.appendLeft('(');
-          buffer.prependRight(' as $typeClass$typeClassParams).$typeParam');
-          result[expr.key] = (result[expr.key] ?? [])..add(buffer);
-        }
-      }
-    }
-    return result;
-  }
-
-  @override
-  Map<String, List<OutsideInBuffer>> visitArrayType(ArrayType node) {
-    final exprs = node.elementType.accept(this);
-    for (final e in exprs.values.expand((i) => i)) {
-      e.appendLeft('((');
-      e.prependRight(' as ${_jArray}Type).elementType as $_jType)');
-    }
-    return exprs;
-  }
-
-  @override
-  Map<String, List<OutsideInBuffer>> visitPrimitiveType(PrimitiveType node) {
-    return {};
-  }
-}
-
 /// Method defintion for Impl abstract class used for interface implementation.
 class _AbstractImplMethod extends Visitor<Method, void> {
   final Resolver resolver;
@@ -2009,22 +1533,18 @@
 
   @override
   void visit(Param node) {
-    final typeClass = node.type
-        .accept(
-          _TypeClassGenerator(
-            resolver,
-            boxPrimitives: true,
-            forInterfaceImplementation: true,
-            includeNullability: false,
-          ),
-        )
-        .name;
-    final nullable = node.isNullable && node.type is! PrimitiveType ? '?' : '!';
-    s.write('\$a![$paramIndex]$nullable.as($typeClass, releaseOriginal: true)');
     if (node.type is PrimitiveType) {
+      final type = node.type.accept(_TypeGenerator(
+        resolver,
+        forInterfaceImplementation: true,
+        boxPrimitives: true,
+      ));
+      s.write('(\$a![$paramIndex] as $type)');
       // Convert to Dart type.
       final name = node.type.name;
       s.write('.${name}Value(releaseOriginal: true)');
+    } else {
+      s.write('\$a![$paramIndex]');
     }
     s.writeln(',');
   }
diff --git a/pkgs/jnigen/lib/src/bindings/linker.dart b/pkgs/jnigen/lib/src/bindings/linker.dart
index 512ee46..3b3d9a7 100644
--- a/pkgs/jnigen/lib/src/bindings/linker.dart
+++ b/pkgs/jnigen/lib/src/bindings/linker.dart
@@ -154,8 +154,6 @@
       }
     }
 
-    node.superCount = superclass.superCount + 1;
-
     final fieldLinker = _FieldLinker(typeLinker);
     for (final field in node.fields) {
       field.classDecl = node;
diff --git a/pkgs/jnigen/lib/src/config/config_types.dart b/pkgs/jnigen/lib/src/config/config_types.dart
index e65bd65..863fa1d 100644
--- a/pkgs/jnigen/lib/src/config/config_types.dart
+++ b/pkgs/jnigen/lib/src/config/config_types.dart
@@ -274,6 +274,7 @@
       this.logLevel = Level.INFO,
       this.dumpJsonTo,
       this.imports,
+      this.hide,
       this.visitors}) {
     for (final className in classes) {
       _validateClassName(className);
@@ -323,6 +324,9 @@
   /// List of dependencies.
   final List<Uri>? imports;
 
+  /// Hide concrete classes from the imports
+  final List<String>? hide;
+
   /// Call [importClasses] before using this.
   late final Map<String, ClassDecl> importedClasses;
 
@@ -387,6 +391,9 @@
         final classes = entry.value as YamlMap;
         for (final classEntry in classes.entries) {
           final binaryName = classEntry.key as String;
+          if (hide?.contains(binaryName) ?? false) {
+            continue;
+          }
           final decl = classEntry.value as YamlMap;
           if (importedClasses.containsKey(binaryName)) {
             log.fatal(
@@ -400,7 +407,6 @@
           )
             ..path = '$importPath/$filePath'
             ..finalName = decl['name'] as String
-            ..superCount = decl['super_count'] as int
             ..allTypeParams = []
             // TODO(https://github.com/dart-lang/native/issues/746): include
             // outerClass in the interop information.
diff --git a/pkgs/jnigen/lib/src/elements/elements.dart b/pkgs/jnigen/lib/src/elements/elements.dart
index 268d2d0..7353100 100644
--- a/pkgs/jnigen/lib/src/elements/elements.dart
+++ b/pkgs/jnigen/lib/src/elements/elements.dart
@@ -132,12 +132,6 @@
 
   String get packageName => (binaryName.split('.')..removeLast()).join('.');
 
-  /// The number of super classes this type has.
-  ///
-  /// Populated by [Linker].
-  @JsonKey(includeFromJson: false)
-  late int superCount;
-
   /// Final name of this class.
   ///
   /// Populated by [Renamer].
@@ -149,9 +143,6 @@
   @JsonKey(includeFromJson: false)
   String get typeClassName => '\$$finalName\$Type\$';
 
-  /// Name of the nullable type class.
-  String get nullableTypeClassName => '\$$finalName\$NullableType\$';
-
   /// Type parameters including the ones from its outer classes.
   ///
   /// For `Foo<T>.Bar<U, V>.Baz<W>` it is [T, U, V, W].
@@ -217,7 +208,7 @@
       .split('.')
       .last;
 
-  bool get isObject => superCount == 0;
+  bool get isObject => binaryName == DeclaredType.object.binaryName;
 
   @JsonKey(includeFromJson: false)
   bool get isNested => outerClassBinaryName != null;
diff --git a/pkgs/jnigen/test/kotlin_test/bindings/kotlin.dart b/pkgs/jnigen/test/kotlin_test/bindings/kotlin.dart
index 2a14012..03f43f0 100644
--- a/pkgs/jnigen/test/kotlin_test/bindings/kotlin.dart
+++ b/pkgs/jnigen/test/kotlin_test/bindings/kotlin.dart
@@ -41,17 +41,7 @@
 import 'package:jni/jni.dart' as jni$_;
 
 /// from: `com.github.dart_lang.jnigen.CanDoA`
-class CanDoA extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<CanDoA> $type;
-
-  @jni$_.internal
-  CanDoA.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type CanDoA._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/CanDoA');
 
@@ -154,9 +144,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return CanDoA.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<CanDoA>();
   }
 }
 
@@ -194,13 +182,6 @@
 
   @jni$_.internal
   @core$_.override
-  CanDoA? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : CanDoA.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -231,11 +212,6 @@
 
   @jni$_.internal
   @core$_.override
-  CanDoA fromReference(jni$_.JReference reference) => CanDoA.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -256,17 +232,7 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.CanDoB`
-class CanDoB extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<CanDoB> $type;
-
-  @jni$_.internal
-  CanDoB.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type CanDoB._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/CanDoB');
 
@@ -369,9 +335,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return CanDoB.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<CanDoB>();
   }
 }
 
@@ -409,13 +373,6 @@
 
   @jni$_.internal
   @core$_.override
-  CanDoB? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : CanDoB.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -446,11 +403,6 @@
 
   @jni$_.internal
   @core$_.override
-  CanDoB fromReference(jni$_.JReference reference) => CanDoB.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -471,21 +423,8 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.Measure`
-class Measure<$T extends jni$_.JObject> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Measure<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  Measure.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type Measure<$T extends jni$_.JObject>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/Measure');
 
@@ -551,7 +490,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   $T getUnit() {
     return _getUnit(reference.pointer, _id_getUnit as jni$_.JMethodIDPtr)
-        .object<$T>(T);
+        .object<$T>();
   }
 
   static final _id_convertValue = _class.instanceMethodId(
@@ -597,14 +536,6 @@
 
   @jni$_.internal
   @core$_.override
-  Measure<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Measure<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -642,13 +573,6 @@
 
   @jni$_.internal
   @core$_.override
-  Measure<$T> fromReference(jni$_.JReference reference) =>
-      Measure<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -671,17 +595,7 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.MeasureUnit`
-class MeasureUnit extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MeasureUnit> $type;
-
-  @jni$_.internal
-  MeasureUnit.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type MeasureUnit._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/MeasureUnit');
 
@@ -712,7 +626,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString getSign() {
     return _getSign(reference.pointer, _id_getSign as jni$_.JMethodIDPtr)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_getCoefficient = _class.instanceMethodId(
@@ -817,9 +731,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return MeasureUnit.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<MeasureUnit>();
   }
 }
 
@@ -862,13 +774,6 @@
 
   @jni$_.internal
   @core$_.override
-  MeasureUnit? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : MeasureUnit.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -899,12 +804,6 @@
 
   @jni$_.internal
   @core$_.override
-  MeasureUnit fromReference(jni$_.JReference reference) =>
-      MeasureUnit.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -927,30 +826,9 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.Nullability$InnerClass`
-class Nullability$InnerClass<$T extends jni$_.JObject?,
-    $U extends jni$_.JObject, $V extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Nullability$InnerClass<$T, $U, $V>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  Nullability$InnerClass.fromReference(
-    this.T,
-    this.U,
-    this.V,
-    jni$_.JReference reference,
-  )   : $type = type<$T, $U, $V>(T, U, V),
-        super.fromReference(reference);
-
+extension type Nullability$InnerClass<$T extends jni$_.JObject?,
+        $U extends jni$_.JObject, $V extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/Nullability$InnerClass');
 
@@ -1004,27 +882,12 @@
   /// from: `public void <init>(com.github.dart_lang.jnigen.Nullability<T, U> $outerClass)`
   /// The returned object must be released after use, by calling the [release] method.
   factory Nullability$InnerClass(
-    Nullability<$T?, $U> $outerClass, {
-    jni$_.JType<$T>? T,
-    jni$_.JType<$U>? U,
-    required jni$_.JType<$V> V,
-  }) {
-    T ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $Nullability$Type$<core$_.dynamic, core$_.dynamic>)
-          .T,
-    ]) as jni$_.JType<$T>;
-    U ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $Nullability$Type$<core$_.dynamic, core$_.dynamic>)
-          .U,
-    ]) as jni$_.JType<$U>;
+    Nullability<$T?, $U> $outerClass,
+  ) {
     final _$$outerClass = $outerClass.reference;
-    return Nullability$InnerClass<$T, $U, $V>.fromReference(
-        T,
-        U,
-        V,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$$outerClass.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer)
+        .object<Nullability$InnerClass<$T, $U, $V>>();
   }
 
   static final _id_f = _class.instanceMethodId(
@@ -1092,18 +955,6 @@
 
   @jni$_.internal
   @core$_.override
-  Nullability$InnerClass<$T, $U, $V>? fromReference(
-          jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : Nullability$InnerClass<$T, $U, $V>.fromReference(
-              T,
-              U,
-              V,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -1155,16 +1006,6 @@
 
   @jni$_.internal
   @core$_.override
-  Nullability$InnerClass<$T, $U, $V> fromReference(
-          jni$_.JReference reference) =>
-      Nullability$InnerClass<$T, $U, $V>.fromReference(
-        T,
-        U,
-        V,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -1190,26 +1031,8 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.Nullability`
-class Nullability<$T extends jni$_.JObject?, $U extends jni$_.JObject>
-    extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Nullability<$T, $U>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  Nullability.fromReference(
-    this.T,
-    this.U,
-    jni$_.JReference reference,
-  )   : $type = type<$T, $U>(T, U),
-        super.fromReference(reference);
-
+extension type Nullability<$T extends jni$_.JObject?,
+    $U extends jni$_.JObject>._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/Nullability');
 
@@ -1265,22 +1088,14 @@
   factory Nullability(
     $T object,
     $U object1,
-    $U? object2, {
-    required jni$_.JType<$T> T,
-    jni$_.JType<$U>? U,
-  }) {
-    U ??= jni$_.lowestCommonSuperType([
-      object1.$type,
-    ]) as jni$_.JType<$U>;
+    $U? object2,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     final _$object1 = object1.reference;
     final _$object2 = object2?.reference ?? jni$_.jNullReference;
-    return Nullability<$T, $U>.fromReference(
-        T,
-        U,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$object.pointer, _$object1.pointer, _$object2.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$object.pointer, _$object1.pointer, _$object2.pointer)
+        .object<Nullability<$T, $U>>();
   }
 
   static final _id_getT = _class.instanceMethodId(
@@ -1304,7 +1119,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   $T getT() {
     return _getT(reference.pointer, _id_getT as jni$_.JMethodIDPtr)
-        .object<$T>(T);
+        .object<$T>();
   }
 
   static final _id_getU = _class.instanceMethodId(
@@ -1328,7 +1143,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   $U getU() {
     return _getU(reference.pointer, _id_getU as jni$_.JMethodIDPtr)
-        .object<$U>(U);
+        .object<$U>();
   }
 
   static final _id_getNullableU = _class.instanceMethodId(
@@ -1353,7 +1168,7 @@
   $U? getNullableU() {
     return _getNullableU(
             reference.pointer, _id_getNullableU as jni$_.JMethodIDPtr)
-        .object<$U?>(U.nullableType);
+        .object<$U?>();
   }
 
   static final _id_setNullableU = _class.instanceMethodId(
@@ -1403,9 +1218,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   Nullability<jni$_.JObject?, jni$_.JObject> self() {
     return _self(reference.pointer, _id_self as jni$_.JMethodIDPtr)
-        .object<Nullability<jni$_.JObject?, jni$_.JObject>>(
-            const $Nullability$Type$<jni$_.JObject?, jni$_.JObject>(
-                jni$_.$JObject$NullableType$(), jni$_.$JObject$Type$()));
+        .object<Nullability<jni$_.JObject?, jni$_.JObject>>();
   }
 
   static final _id_hello = _class.instanceMethodId(
@@ -1429,7 +1242,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString hello() {
     return _hello(reference.pointer, _id_hello as jni$_.JMethodIDPtr)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_nullableHello = _class.instanceMethodId(
@@ -1454,7 +1267,7 @@
   ) {
     return _nullableHello(reference.pointer,
             _id_nullableHello as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_list = _class.instanceMethodId(
@@ -1478,9 +1291,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JObject?> list() {
     return _list(reference.pointer, _id_list as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JObject?>>(
-            const jni$_.$JList$Type$<jni$_.JObject?>(
-                jni$_.$JObject$NullableType$()));
+        .object<jni$_.JList<jni$_.JObject?>>();
   }
 
   static final _id_methodGenericEcho = _class.instanceMethodId(
@@ -1502,16 +1313,12 @@
   /// from: `public fun <V : kotlin.Any> methodGenericEcho(v: V): V`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericEcho<$V extends jni$_.JObject>(
-    $V object, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      object.$type,
-    ]) as jni$_.JType<$V>;
+    $V object,
+  ) {
     final _$object = object.reference;
     return _methodGenericEcho(reference.pointer,
             _id_methodGenericEcho as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_methodGenericNullableEcho = _class.instanceMethodId(
@@ -1533,15 +1340,14 @@
   /// from: `public fun <V> methodGenericNullableEcho(v: V): V`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericNullableEcho<$V extends jni$_.JObject?>(
-    $V object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _methodGenericNullableEcho(
             reference.pointer,
             _id_methodGenericNullableEcho as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_classGenericEcho = _class.instanceMethodId(
@@ -1568,7 +1374,7 @@
     final _$object = object.reference;
     return _classGenericEcho(reference.pointer,
             _id_classGenericEcho as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$U>(U);
+        .object<$U>();
   }
 
   static final _id_classGenericNullableEcho = _class.instanceMethodId(
@@ -1597,7 +1403,7 @@
             reference.pointer,
             _id_classGenericNullableEcho as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<$T>(T);
+        .object<$T>();
   }
 
   static final _id_firstOf = _class.instanceMethodId(
@@ -1624,7 +1430,7 @@
     final _$list = list.reference;
     return _firstOf(reference.pointer, _id_firstOf as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_firstOfNullable = _class.instanceMethodId(
@@ -1651,7 +1457,7 @@
     final _$list = list.reference;
     return _firstOfNullable(reference.pointer,
             _id_firstOfNullable as jni$_.JMethodIDPtr, _$list.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_classGenericFirstOf = _class.instanceMethodId(
@@ -1678,7 +1484,7 @@
     final _$list = list.reference;
     return _classGenericFirstOf(reference.pointer,
             _id_classGenericFirstOf as jni$_.JMethodIDPtr, _$list.pointer)
-        .object<$U>(U);
+        .object<$U>();
   }
 
   static final _id_classGenericFirstOfNullable = _class.instanceMethodId(
@@ -1708,7 +1514,7 @@
             reference.pointer,
             _id_classGenericFirstOfNullable as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$T>(T);
+        .object<$T>();
   }
 
   static final _id_methodGenericFirstOf = _class.instanceMethodId(
@@ -1730,16 +1536,12 @@
   /// from: `public fun <V : kotlin.Any> methodGenericFirstOf(list: kotlin.collections.List<V>): V`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericFirstOf<$V extends jni$_.JObject>(
-    jni$_.JList<$V> list, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (list.$type as jni$_.$JList$Type$<core$_.dynamic>).E,
-    ]) as jni$_.JType<$V>;
+    jni$_.JList<$V> list,
+  ) {
     final _$list = list.reference;
     return _methodGenericFirstOf(reference.pointer,
             _id_methodGenericFirstOf as jni$_.JMethodIDPtr, _$list.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_methodGenericFirstOfNullable = _class.instanceMethodId(
@@ -1762,18 +1564,14 @@
   /// from: `public fun <V> methodGenericFirstOfNullable(list: kotlin.collections.List<V>): V`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericFirstOfNullable<$V extends jni$_.JObject?>(
-    jni$_.JList<$V> list, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (list.$type as jni$_.$JList$Type$<core$_.dynamic>).E,
-    ]) as jni$_.JType<$V>;
+    jni$_.JList<$V> list,
+  ) {
     final _$list = list.reference;
     return _methodGenericFirstOfNullable(
             reference.pointer,
             _id_methodGenericFirstOfNullable as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_stringListOf = _class.instanceMethodId(
@@ -1800,8 +1598,7 @@
     final _$string = string.reference;
     return _stringListOf(reference.pointer,
             _id_stringListOf as jni$_.JMethodIDPtr, _$string.pointer)
-        .object<jni$_.JList<jni$_.JString>>(
-            const jni$_.$JList$Type$<jni$_.JString>(jni$_.$JString$Type$()));
+        .object<jni$_.JList<jni$_.JString>>();
   }
 
   static final _id_nullableListOf = _class.instanceMethodId(
@@ -1828,9 +1625,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _nullableListOf(reference.pointer,
             _id_nullableListOf as jni$_.JMethodIDPtr, _$string.pointer)
-        .object<jni$_.JList<jni$_.JString?>>(
-            const jni$_.$JList$Type$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<jni$_.JList<jni$_.JString?>>();
   }
 
   static final _id_classGenericListOf = _class.instanceMethodId(
@@ -1857,7 +1652,7 @@
     final _$object = object.reference;
     return _classGenericListOf(reference.pointer,
             _id_classGenericListOf as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<jni$_.JList<$U>>(jni$_.$JList$Type$<$U>(U));
+        .object<jni$_.JList<$U>>();
   }
 
   static final _id_classGenericNullableListOf = _class.instanceMethodId(
@@ -1887,7 +1682,7 @@
             reference.pointer,
             _id_classGenericNullableListOf as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<jni$_.JList<$T>>(jni$_.$JList$Type$<$T>(T));
+        .object<jni$_.JList<$T>>();
   }
 
   static final _id_methodGenericListOf = _class.instanceMethodId(
@@ -1909,16 +1704,12 @@
   /// from: `public fun <V : kotlin.Any> methodGenericListOf(element: V): kotlin.collections.List<V>`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<$V> methodGenericListOf<$V extends jni$_.JObject>(
-    $V object, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      object.$type,
-    ]) as jni$_.JType<$V>;
+    $V object,
+  ) {
     final _$object = object.reference;
     return _methodGenericListOf(reference.pointer,
             _id_methodGenericListOf as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<jni$_.JList<$V>>(jni$_.$JList$Type$<$V>(V));
+        .object<jni$_.JList<$V>>();
   }
 
   static final _id_methodGenericNullableListOf = _class.instanceMethodId(
@@ -1941,15 +1732,14 @@
   /// from: `public fun <V> methodGenericNullableListOf(element: V): kotlin.collections.List<V>`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<$V> methodGenericNullableListOf<$V extends jni$_.JObject?>(
-    $V object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _methodGenericNullableListOf(
             reference.pointer,
             _id_methodGenericNullableListOf as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<jni$_.JList<$V>>(jni$_.$JList$Type$<$V>(V));
+        .object<jni$_.JList<$V>>();
   }
 
   static final _id_methodWithVarArgs = _class.instanceMethodId(
@@ -1996,12 +1786,8 @@
 
   /// from: `public fun <V> methodWithWhere(element: V): kotlin.Int where V : com.github.dart_lang.jnigen.CanDoA, V : com.github.dart_lang.jnigen.CanDoB`
   int methodWithWhere<$V extends jni$_.JObject>(
-    $V canDoA, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      canDoA.$type,
-    ]) as jni$_.JType<$V>;
+    $V canDoA,
+  ) {
     final _$canDoA = canDoA.reference;
     return _methodWithWhere(reference.pointer,
             _id_methodWithWhere as jni$_.JMethodIDPtr, _$canDoA.pointer)
@@ -2029,16 +1815,6 @@
 
   @jni$_.internal
   @core$_.override
-  Nullability<$T, $U>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : Nullability<$T, $U>.fromReference(
-              T,
-              U,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -2081,14 +1857,6 @@
 
   @jni$_.internal
   @core$_.override
-  Nullability<$T, $U> fromReference(jni$_.JReference reference) =>
-      Nullability<$T, $U>.fromReference(
-        T,
-        U,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -2113,17 +1881,7 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.Operators`
-class Operators extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Operators> $type;
-
-  @jni$_.internal
-  Operators.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Operators._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/Operators');
 
@@ -2152,9 +1910,8 @@
   factory Operators(
     int i,
   ) {
-    return Operators.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr, i)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr, i)
+        .object<Operators>();
   }
 
   static final _id_getValue = _class.instanceMethodId(
@@ -2226,7 +1983,7 @@
     final _$operators = operators.reference;
     return _plus(reference.pointer, _id_plus as jni$_.JMethodIDPtr,
             _$operators.pointer)
-        .object<Operators>(const $Operators$Type$());
+        .object<Operators>();
   }
 
   static final _id_plus$1 = _class.instanceMethodId(
@@ -2250,7 +2007,7 @@
     int i,
   ) {
     return _plus$1(reference.pointer, _id_plus$1 as jni$_.JMethodIDPtr, i)
-        .object<Operators>(const $Operators$Type$());
+        .object<Operators>();
   }
 
   static final _id_minus = _class.instanceMethodId(
@@ -2277,7 +2034,7 @@
     final _$operators = operators.reference;
     return _minus(reference.pointer, _id_minus as jni$_.JMethodIDPtr,
             _$operators.pointer)
-        .object<Operators>(const $Operators$Type$());
+        .object<Operators>();
   }
 
   static final _id_times = _class.instanceMethodId(
@@ -2304,7 +2061,7 @@
     final _$operators = operators.reference;
     return _times(reference.pointer, _id_times as jni$_.JMethodIDPtr,
             _$operators.pointer)
-        .object<Operators>(const $Operators$Type$());
+        .object<Operators>();
   }
 
   static final _id_div = _class.instanceMethodId(
@@ -2331,7 +2088,7 @@
     final _$operators = operators.reference;
     return _div(reference.pointer, _id_div as jni$_.JMethodIDPtr,
             _$operators.pointer)
-        .object<Operators>(const $Operators$Type$());
+        .object<Operators>();
   }
 
   static final _id_rem = _class.instanceMethodId(
@@ -2358,7 +2115,7 @@
     final _$operators = operators.reference;
     return _rem(reference.pointer, _id_rem as jni$_.JMethodIDPtr,
             _$operators.pointer)
-        .object<Operators>(const $Operators$Type$());
+        .object<Operators>();
   }
 
   static final _id_get = _class.instanceMethodId(
@@ -2490,13 +2247,6 @@
 
   @jni$_.internal
   @core$_.override
-  Operators? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Operators.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -2527,12 +2277,6 @@
 
   @jni$_.internal
   @core$_.override
-  Operators fromReference(jni$_.JReference reference) =>
-      Operators.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -2553,17 +2297,7 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.Speed`
-class Speed extends Measure<SpeedUnit> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Speed> $type;
-
-  @jni$_.internal
-  Speed.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(const $SpeedUnit$Type$(), reference);
-
+extension type Speed._(jni$_.JObject _$this) implements Measure<SpeedUnit> {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/Speed');
 
@@ -2597,9 +2331,9 @@
     SpeedUnit speedUnit,
   ) {
     final _$speedUnit = speedUnit.reference;
-    return Speed.fromReference(_new$(_class.reference.pointer,
-            _id_new$ as jni$_.JMethodIDPtr, f, _$speedUnit.pointer)
-        .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr, f,
+            _$speedUnit.pointer)
+        .object<Speed>();
   }
 
   static final _id_getValue = _class.instanceMethodId(
@@ -2646,7 +2380,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   SpeedUnit getUnit$1() {
     return _getUnit$1(reference.pointer, _id_getUnit$1 as jni$_.JMethodIDPtr)
-        .object<SpeedUnit>(const $SpeedUnit$Type$());
+        .object<SpeedUnit>();
   }
 
   static final _id_toString$1 = _class.instanceMethodId(
@@ -2670,7 +2404,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString toString$1() {
     return _toString$1(reference.pointer, _id_toString$1 as jni$_.JMethodIDPtr)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_component1 = _class.instanceMethodId(
@@ -2717,7 +2451,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   SpeedUnit component2() {
     return _component2(reference.pointer, _id_component2 as jni$_.JMethodIDPtr)
-        .object<SpeedUnit>(const $SpeedUnit$Type$());
+        .object<SpeedUnit>();
   }
 
   static final _id_copy = _class.instanceMethodId(
@@ -2748,7 +2482,7 @@
     final _$speedUnit = speedUnit.reference;
     return _copy(reference.pointer, _id_copy as jni$_.JMethodIDPtr, f,
             _$speedUnit.pointer)
-        .object<Speed>(const $Speed$Type$());
+        .object<Speed>();
   }
 
   static final _id_hashCode$1 = _class.instanceMethodId(
@@ -2811,13 +2545,6 @@
 
   @jni$_.internal
   @core$_.override
-  Speed? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Speed.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType =>
       const $Measure$Type$<SpeedUnit>($SpeedUnit$Type$());
 
@@ -2849,11 +2576,6 @@
 
   @jni$_.internal
   @core$_.override
-  Speed fromReference(jni$_.JReference reference) => Speed.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType =>
       const $Measure$Type$<SpeedUnit>($SpeedUnit$Type$());
 
@@ -2875,17 +2597,7 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.SpeedUnit`
-class SpeedUnit extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<SpeedUnit> $type;
-
-  @jni$_.internal
-  SpeedUnit.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type SpeedUnit._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/SpeedUnit');
 
@@ -2903,7 +2615,7 @@
   /// from: `static public final com.github.dart_lang.jnigen.SpeedUnit KmPerHour`
   /// The returned object must be released after use, by calling the [release] method.
   static SpeedUnit get KmPerHour =>
-      _id_KmPerHour.get(_class, const $SpeedUnit$Type$());
+      _id_KmPerHour.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_MetrePerSec = _class.staticFieldId(
     r'MetrePerSec',
@@ -2913,7 +2625,7 @@
   /// from: `static public final com.github.dart_lang.jnigen.SpeedUnit MetrePerSec`
   /// The returned object must be released after use, by calling the [release] method.
   static SpeedUnit get MetrePerSec =>
-      _id_MetrePerSec.get(_class, const $SpeedUnit$Type$());
+      _id_MetrePerSec.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_getSign = _class.instanceMethodId(
     r'getSign',
@@ -2936,7 +2648,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString getSign() {
     return _getSign(reference.pointer, _id_getSign as jni$_.JMethodIDPtr)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_getCoefficient = _class.instanceMethodId(
@@ -2984,9 +2696,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JArray<SpeedUnit?>? values() {
     return _values(_class.reference.pointer, _id_values as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<SpeedUnit?>?>(
-            const jni$_.$JArray$NullableType$<SpeedUnit?>(
-                $SpeedUnit$NullableType$()));
+        .object<jni$_.JArray<SpeedUnit?>?>();
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -3013,7 +2723,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _valueOf(_class.reference.pointer, _id_valueOf as jni$_.JMethodIDPtr,
             _$string.pointer)
-        .object<SpeedUnit?>(const $SpeedUnit$NullableType$());
+        .object<SpeedUnit?>();
   }
 }
 
@@ -3027,13 +2737,6 @@
 
   @jni$_.internal
   @core$_.override
-  SpeedUnit? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : SpeedUnit.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -3064,12 +2767,6 @@
 
   @jni$_.internal
   @core$_.override
-  SpeedUnit fromReference(jni$_.JReference reference) =>
-      SpeedUnit.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -3090,17 +2787,7 @@
 }
 
 /// from: `com.github.dart_lang.jnigen.SuspendFun`
-class SuspendFun extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<SuspendFun> $type;
-
-  @jni$_.internal
-  SuspendFun.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type SuspendFun._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/SuspendFun');
 
@@ -3129,9 +2816,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory SuspendFun() {
-    return SuspendFun.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<SuspendFun>();
   }
 
   static final _id_sayHelloWithoutDelay = _class.instanceMethodId(
@@ -3160,7 +2846,7 @@
             reference.pointer,
             _id_sayHelloWithoutDelay as jni$_.JMethodIDPtr,
             _$continuation.pointer)
-        .object<jni$_.JObject>(const jni$_.$JObject$Type$());
+        .object<jni$_.JObject>();
     _$continuation.release();
     final jni$_.JObject $o;
     if ($r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3207,7 +2893,7 @@
 
     final $r = _failWithoutDelay(reference.pointer,
             _id_failWithoutDelay as jni$_.JMethodIDPtr, _$continuation.pointer)
-        .object<jni$_.JObject>(const jni$_.$JObject$Type$());
+        .object<jni$_.JObject>();
     _$continuation.release();
     final jni$_.JObject $o;
     if ($r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3254,7 +2940,7 @@
 
     final $r = _fail(reference.pointer, _id_fail as jni$_.JMethodIDPtr,
             _$continuation.pointer)
-        .object<jni$_.JObject>(const jni$_.$JObject$Type$());
+        .object<jni$_.JObject>();
     _$continuation.release();
     final jni$_.JObject $o;
     if ($r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3301,7 +2987,7 @@
 
     final $r = _sayHello(reference.pointer, _id_sayHello as jni$_.JMethodIDPtr,
             _$continuation.pointer)
-        .object<jni$_.JObject>(const jni$_.$JObject$Type$());
+        .object<jni$_.JObject>();
     _$continuation.release();
     final jni$_.JObject $o;
     if ($r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3359,7 +3045,7 @@
             _id_sayHello$1 as jni$_.JMethodIDPtr,
             _$string.pointer,
             _$continuation.pointer)
-        .object<jni$_.JObject>(const jni$_.$JObject$Type$());
+        .object<jni$_.JObject>();
     _$continuation.release();
     final jni$_.JObject $o;
     if ($r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3412,7 +3098,7 @@
             _id_nullableHello as jni$_.JMethodIDPtr,
             z ? 1 : 0,
             _$continuation.pointer)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
     _$continuation.release();
     final jni$_.JObject? $o;
     if ($r != null && $r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3467,7 +3153,7 @@
             _id_nullableHelloWithoutDelay as jni$_.JMethodIDPtr,
             z ? 1 : 0,
             _$continuation.pointer)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
     _$continuation.release();
     final jni$_.JObject? $o;
     if ($r != null && $r.isInstanceOf(jni$_.coroutineSingletonsClass)) {
@@ -3503,13 +3189,6 @@
 
   @jni$_.internal
   @core$_.override
-  SuspendFun? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : SuspendFun.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
@@ -3540,12 +3219,6 @@
 
   @jni$_.internal
   @core$_.override
-  SuspendFun fromReference(jni$_.JReference reference) =>
-      SuspendFun.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
   jni$_.JType get superType => const jni$_.$JObject$Type$();
 
   @jni$_.internal
diff --git a/pkgs/jnigen/test/kotlin_test/runtime_test_registrant.dart b/pkgs/jnigen/test/kotlin_test/runtime_test_registrant.dart
index 4e41f1a..3608f0a 100644
--- a/pkgs/jnigen/test/kotlin_test/runtime_test_registrant.dart
+++ b/pkgs/jnigen/test/kotlin_test/runtime_test_registrant.dart
@@ -145,8 +145,6 @@
           null,
           'hello'.toJString(),
           null,
-          T: JString.nullableType,
-          U: JString.type,
         )..releasedBy(arena);
       }
 
@@ -211,7 +209,6 @@
             obj
                 .methodGenericEcho(
                   'hello'.toJString()..releasedBy(arena),
-                  V: JString.type,
                 )
                 .toDartString(releaseOriginal: true),
             'hello',
@@ -220,13 +217,12 @@
             obj
                 .methodGenericNullableEcho(
                   'hello'.toJString()..releasedBy(arena),
-                  V: JString.nullableType,
-                )!
+                )
                 .toDartString(releaseOriginal: true),
             'hello',
           );
           expect(
-            obj.methodGenericNullableEcho(null, V: JString.nullableType),
+            obj.methodGenericNullableEcho(null),
             null,
           );
           expect(
@@ -264,15 +260,14 @@
           );
           expect(
             obj
-                .methodGenericNullableListOf(
+                .methodGenericNullableListOf<JString?>(
                   'hello'.toJString()..releasedBy(arena),
-                  V: JString.nullableType,
                 )[0]!
                 .toDartString(releaseOriginal: true),
             'hello',
           );
           expect(
-            obj.methodGenericNullableListOf(null, V: JString.nullableType)[0],
+            obj.methodGenericNullableListOf(null)[0],
             null,
           );
           expect(
diff --git a/pkgs/jnigen/test/simple_package_test/bindings/simple_package.dart b/pkgs/jnigen/test/simple_package_test/bindings/simple_package.dart
index e41c179..2ec3b68 100644
--- a/pkgs/jnigen/test/simple_package_test/bindings/simple_package.dart
+++ b/pkgs/jnigen/test/simple_package_test/bindings/simple_package.dart
@@ -41,25 +41,12 @@
 import 'package:jni/jni.dart' as jni$_;
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Example$Nested$NestedTwice`
-class Example$Nested$NestedTwice extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Example$Nested$NestedTwice> $type;
-
-  @jni$_.internal
-  Example$Nested$NestedTwice.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Example$Nested$NestedTwice._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Example$Nested$NestedTwice');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Example$Nested$NestedTwice?> nullableType =
-      $Example$Nested$NestedTwice$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Example$Nested$NestedTwice> type =
       $Example$Nested$NestedTwice$Type$();
   static final _id_ZERO = _class.staticFieldId(
@@ -68,11 +55,10 @@
   );
 
   /// from: `static public int ZERO`
-  static int get ZERO => _id_ZERO.get(_class, const jni$_.jintType());
+  static int get ZERO => _id_ZERO.get(_class, jni$_.jint.type);
 
   /// from: `static public int ZERO`
-  static set ZERO(int value) =>
-      _id_ZERO.set(_class, const jni$_.jintType(), value);
+  static set ZERO(int value) => _id_ZERO.set(_class, jni$_.jint.type, value);
 
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -93,49 +79,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory Example$Nested$NestedTwice() {
-    return Example$Nested$NestedTwice.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $Example$Nested$NestedTwice$NullableType$
-    extends jni$_.JType<Example$Nested$NestedTwice?> {
-  @jni$_.internal
-  const $Example$Nested$NestedTwice$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Example$Nested$NestedTwice;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$Nested$NestedTwice? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : Example$Nested$NestedTwice.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$Nested$NestedTwice?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$Nested$NestedTwice$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$Nested$NestedTwice$NullableType$) &&
-        other is $Example$Nested$NestedTwice$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<Example$Nested$NestedTwice>();
   }
 }
 
@@ -148,56 +93,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Example$Nested$NestedTwice;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$Nested$NestedTwice fromReference(jni$_.JReference reference) =>
-      Example$Nested$NestedTwice.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$Nested$NestedTwice?> get nullableType =>
-      const $Example$Nested$NestedTwice$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$Nested$NestedTwice$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$Nested$NestedTwice$Type$) &&
-        other is $Example$Nested$NestedTwice$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Example$Nested`
-class Example$Nested extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Example$Nested> $type;
-
-  @jni$_.internal
-  Example$Nested.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Example$Nested._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Example$Nested');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Example$Nested?> nullableType =
-      $Example$Nested$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Example$Nested> type = $Example$Nested$Type$();
   static final _id_new$ = _class.constructorId(
     r'(Z)V',
@@ -218,9 +121,9 @@
   factory Example$Nested(
     bool z,
   ) {
-    return Example$Nested.fromReference(_new$(
+    return _new$(
             _class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .reference);
+        .object<Example$Nested>();
   }
 
   static final _id_usesAnonymousInnerClass = _class.instanceMethodId(
@@ -294,44 +197,6 @@
   }
 }
 
-final class $Example$Nested$NullableType$ extends jni$_.JType<Example$Nested?> {
-  @jni$_.internal
-  const $Example$Nested$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Example$Nested;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$Nested? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Example$Nested.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$Nested?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$Nested$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$Nested$NullableType$) &&
-        other is $Example$Nested$NullableType$;
-  }
-}
-
 final class $Example$Nested$Type$ extends jni$_.JType<Example$Nested> {
   @jni$_.internal
   const $Example$Nested$Type$();
@@ -340,56 +205,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Example$Nested;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$Nested fromReference(jni$_.JReference reference) =>
-      Example$Nested.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$Nested?> get nullableType =>
-      const $Example$Nested$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$Nested$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$Nested$Type$) &&
-        other is $Example$Nested$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Example$NonStaticNested`
-class Example$NonStaticNested extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Example$NonStaticNested> $type;
-
-  @jni$_.internal
-  Example$NonStaticNested.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Example$NonStaticNested._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Example$NonStaticNested');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Example$NonStaticNested?> nullableType =
-      $Example$NonStaticNested$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Example$NonStaticNested> type =
       $Example$NonStaticNested$Type$();
   static final _id_ok = _class.instanceFieldId(
@@ -398,10 +222,10 @@
   );
 
   /// from: `public boolean ok`
-  bool get ok => _id_ok.get(this, const jni$_.jbooleanType());
+  bool get ok => _id_ok.get(this, jni$_.jboolean.type);
 
   /// from: `public boolean ok`
-  set ok(bool value) => _id_ok.set(this, const jni$_.jbooleanType(), value);
+  set ok(bool value) => _id_ok.set(this, jni$_.jboolean.type, value);
 
   static final _id_new$ = _class.constructorId(
     r'(Lcom/github/dart_lang/jnigen/simple_package/Example;)V',
@@ -424,49 +248,9 @@
     Example $outerClass,
   ) {
     final _$$outerClass = $outerClass.reference;
-    return Example$NonStaticNested.fromReference(_new$(_class.reference.pointer,
-            _id_new$ as jni$_.JMethodIDPtr, _$$outerClass.pointer)
-        .reference);
-  }
-}
-
-final class $Example$NonStaticNested$NullableType$
-    extends jni$_.JType<Example$NonStaticNested?> {
-  @jni$_.internal
-  const $Example$NonStaticNested$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Example$NonStaticNested;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$NonStaticNested? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : Example$NonStaticNested.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$NonStaticNested?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$NonStaticNested$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$NonStaticNested$NullableType$) &&
-        other is $Example$NonStaticNested$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer)
+        .object<Example$NonStaticNested>();
   }
 }
 
@@ -479,55 +263,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Example$NonStaticNested;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$NonStaticNested fromReference(jni$_.JReference reference) =>
-      Example$NonStaticNested.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$NonStaticNested?> get nullableType =>
-      const $Example$NonStaticNested$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$NonStaticNested$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$NonStaticNested$Type$) &&
-        other is $Example$NonStaticNested$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Example`
-class Example extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Example> $type;
-
-  @jni$_.internal
-  Example.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Example._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Example');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Example?> nullableType = $Example$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Example> type = $Example$Type$();
 
   /// from: `static public final int ON`
@@ -549,7 +292,7 @@
   /// from: `static public final java.lang.String SEMICOLON_STRING`
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JString? get SEMICOLON_STRING =>
-      _id_SEMICOLON_STRING.get(_class, const jni$_.$JString$NullableType$());
+      _id_SEMICOLON_STRING.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_unusedRandom = _class.staticFieldId(
     r'unusedRandom',
@@ -653,7 +396,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JString? getName() {
     return _getName(_class.reference.pointer, _id_getName as jni$_.JMethodIDPtr)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_getNestedInstance = _class.staticMethodId(
@@ -678,7 +421,7 @@
   static Example$Nested? getNestedInstance() {
     return _getNestedInstance(_class.reference.pointer,
             _id_getNestedInstance as jni$_.JMethodIDPtr)
-        .object<Example$Nested?>(const $Example$Nested$NullableType$());
+        .object<Example$Nested?>();
   }
 
   static final _id_setAmount = _class.staticMethodId(
@@ -943,7 +686,7 @@
   jni$_.JString? getCodename() {
     return _getCodename(
             reference.pointer, _id_getCodename as jni$_.JMethodIDPtr)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_setCodename = _class.instanceMethodId(
@@ -993,7 +736,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JObject? getRandom() {
     return _getRandom(reference.pointer, _id_getRandom as jni$_.JMethodIDPtr)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
   }
 
   static final _id_setRandom = _class.instanceMethodId(
@@ -1144,7 +887,7 @@
     final _$random = random?.reference ?? jni$_.jNullReference;
     return _getRandomNumericString(reference.pointer,
             _id_getRandomNumericString as jni$_.JMethodIDPtr, _$random.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_finalMethod = _class.instanceMethodId(
@@ -1191,9 +934,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JString?>? getList() {
     return _getList(reference.pointer, _id_getList as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JString?>?>(
-            const jni$_.$JList$NullableType$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<jni$_.JList<jni$_.JString?>?>();
   }
 
   static final _id_joinStrings = _class.instanceMethodId(
@@ -1231,7 +972,7 @@
             _id_joinStrings as jni$_.JMethodIDPtr,
             _$list.pointer,
             _$string.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_methodWithSeveralParams = _class.instanceMethodId(
@@ -1271,9 +1012,8 @@
     jni$_.JIntArray? is$,
     $T? charSequence,
     jni$_.JList<$T?>? list,
-    jni$_.JMap<jni$_.JString?, jni$_.JObject?>? map, {
-    required jni$_.JType<$T> T,
-  }) {
+    jni$_.JMap<jni$_.JString?, jni$_.JObject?>? map,
+  ) {
     final _$string = string?.reference ?? jni$_.jNullReference;
     final _$is$ = is$?.reference ?? jni$_.jNullReference;
     final _$charSequence = charSequence?.reference ?? jni$_.jNullReference;
@@ -1310,9 +1050,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory Example() {
-    return Example.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<Example>();
   }
 
   static final _id_new$1 = _class.constructorId(
@@ -1334,9 +1073,8 @@
   factory Example.new$1(
     int i,
   ) {
-    return Example.fromReference(
-        _new$1(_class.reference.pointer, _id_new$1 as jni$_.JMethodIDPtr, i)
-            .reference);
+    return _new$1(_class.reference.pointer, _id_new$1 as jni$_.JMethodIDPtr, i)
+        .object<Example>();
   }
 
   static final _id_new$2 = _class.constructorId(
@@ -1360,9 +1098,9 @@
     int i,
     bool z,
   ) {
-    return Example.fromReference(_new$2(_class.reference.pointer,
-            _id_new$2 as jni$_.JMethodIDPtr, i, z ? 1 : 0)
-        .reference);
+    return _new$2(_class.reference.pointer, _id_new$2 as jni$_.JMethodIDPtr, i,
+            z ? 1 : 0)
+        .object<Example>();
   }
 
   static final _id_new$3 = _class.constructorId(
@@ -1392,9 +1130,9 @@
     jni$_.JString? string,
   ) {
     final _$string = string?.reference ?? jni$_.jNullReference;
-    return Example.fromReference(_new$3(_class.reference.pointer,
-            _id_new$3 as jni$_.JMethodIDPtr, i, z ? 1 : 0, _$string.pointer)
-        .reference);
+    return _new$3(_class.reference.pointer, _id_new$3 as jni$_.JMethodIDPtr, i,
+            z ? 1 : 0, _$string.pointer)
+        .object<Example>();
   }
 
   static final _id_new$4 = _class.constructorId(
@@ -1433,9 +1171,9 @@
     int i6,
     int i7,
   ) {
-    return Example.fromReference(_new$4(_class.reference.pointer,
-            _id_new$4 as jni$_.JMethodIDPtr, i, i1, i2, i3, i4, i5, i6, i7)
-        .reference);
+    return _new$4(_class.reference.pointer, _id_new$4 as jni$_.JMethodIDPtr, i,
+            i1, i2, i3, i4, i5, i6, i7)
+        .object<Example>();
   }
 
   static final _id_whichExample = _class.instanceMethodId(
@@ -1509,7 +1247,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JIntArray? getArr() {
     return _getArr(_class.reference.pointer, _id_getArr as jni$_.JMethodIDPtr)
-        .object<jni$_.JIntArray?>(const jni$_.$JIntArray$NullableType$());
+        .object<jni$_.JIntArray?>();
   }
 
   static final _id_addAll = _class.staticMethodId(
@@ -1559,7 +1297,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   Example? getSelf() {
     return _getSelf(reference.pointer, _id_getSelf as jni$_.JMethodIDPtr)
-        .object<Example?>(const $Example$NullableType$());
+        .object<Example?>();
   }
 
   static final _id_throwException = _class.staticMethodId(
@@ -1721,44 +1459,6 @@
   }
 }
 
-final class $Example$NullableType$ extends jni$_.JType<Example?> {
-  @jni$_.internal
-  const $Example$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Example;';
-
-  @jni$_.internal
-  @core$_.override
-  Example? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Example.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$NullableType$) &&
-        other is $Example$NullableType$;
-  }
-}
-
 final class $Example$Type$ extends jni$_.JType<Example> {
   @jni$_.internal
   const $Example$Type$();
@@ -1767,53 +1467,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Example;';
-
-  @jni$_.internal
-  @core$_.override
-  Example fromReference(jni$_.JReference reference) => Example.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example?> get nullableType => const $Example$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$Type$) && other is $Example$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Exceptions`
-class Exceptions extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Exceptions> $type;
-
-  @jni$_.internal
-  Exceptions.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Exceptions._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Exceptions');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Exceptions?> nullableType =
-      $Exceptions$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Exceptions> type = $Exceptions$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -1834,9 +1495,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory Exceptions() {
-    return Exceptions.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<Exceptions>();
   }
 
   static final _id_new$1 = _class.constructorId(
@@ -1858,9 +1518,8 @@
   factory Exceptions.new$1(
     double f,
   ) {
-    return Exceptions.fromReference(
-        _new$1(_class.reference.pointer, _id_new$1 as jni$_.JMethodIDPtr, f)
-            .reference);
+    return _new$1(_class.reference.pointer, _id_new$1 as jni$_.JMethodIDPtr, f)
+        .object<Exceptions>();
   }
 
   static final _id_new$2 = _class.constructorId(
@@ -1895,9 +1554,9 @@
     int i4,
     int i5,
   ) {
-    return Exceptions.fromReference(_new$2(_class.reference.pointer,
-            _id_new$2 as jni$_.JMethodIDPtr, i, i1, i2, i3, i4, i5)
-        .reference);
+    return _new$2(_class.reference.pointer, _id_new$2 as jni$_.JMethodIDPtr, i,
+            i1, i2, i3, i4, i5)
+        .object<Exceptions>();
   }
 
   static final _id_staticObjectMethod = _class.staticMethodId(
@@ -1922,7 +1581,7 @@
   static jni$_.JObject? staticObjectMethod() {
     return _staticObjectMethod(_class.reference.pointer,
             _id_staticObjectMethod as jni$_.JMethodIDPtr)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
   }
 
   static final _id_staticIntMethod = _class.staticMethodId(
@@ -1971,9 +1630,7 @@
   static jni$_.JArray<jni$_.JObject?>? staticObjectArrayMethod() {
     return _staticObjectArrayMethod(_class.reference.pointer,
             _id_staticObjectArrayMethod as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<jni$_.JObject?>?>(
-            const jni$_.$JArray$NullableType$<jni$_.JObject?>(
-                jni$_.$JObject$NullableType$()));
+        .object<jni$_.JArray<jni$_.JObject?>?>();
   }
 
   static final _id_staticIntArrayMethod = _class.staticMethodId(
@@ -1998,7 +1655,7 @@
   static jni$_.JIntArray? staticIntArrayMethod() {
     return _staticIntArrayMethod(_class.reference.pointer,
             _id_staticIntArrayMethod as jni$_.JMethodIDPtr)
-        .object<jni$_.JIntArray?>(const jni$_.$JIntArray$NullableType$());
+        .object<jni$_.JIntArray?>();
   }
 
   static final _id_objectMethod = _class.instanceMethodId(
@@ -2023,7 +1680,7 @@
   jni$_.JObject? objectMethod() {
     return _objectMethod(
             reference.pointer, _id_objectMethod as jni$_.JMethodIDPtr)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
   }
 
   static final _id_intMethod = _class.instanceMethodId(
@@ -2071,9 +1728,7 @@
   jni$_.JArray<jni$_.JObject?>? objectArrayMethod() {
     return _objectArrayMethod(
             reference.pointer, _id_objectArrayMethod as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<jni$_.JObject?>?>(
-            const jni$_.$JArray$NullableType$<jni$_.JObject?>(
-                jni$_.$JObject$NullableType$()));
+        .object<jni$_.JArray<jni$_.JObject?>?>();
   }
 
   static final _id_intArrayMethod = _class.instanceMethodId(
@@ -2098,7 +1753,7 @@
   jni$_.JIntArray? intArrayMethod() {
     return _intArrayMethod(
             reference.pointer, _id_intArrayMethod as jni$_.JMethodIDPtr)
-        .object<jni$_.JIntArray?>(const jni$_.$JIntArray$NullableType$());
+        .object<jni$_.JIntArray?>();
   }
 
   static final _id_throwNullPointerException = _class.instanceMethodId(
@@ -2148,7 +1803,7 @@
   jni$_.JObject? throwFileNotFoundException() {
     return _throwFileNotFoundException(reference.pointer,
             _id_throwFileNotFoundException as jni$_.JMethodIDPtr)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
   }
 
   static final _id_throwClassCastException = _class.instanceMethodId(
@@ -2173,7 +1828,7 @@
   jni$_.JObject? throwClassCastException() {
     return _throwClassCastException(reference.pointer,
             _id_throwClassCastException as jni$_.JMethodIDPtr)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
   }
 
   static final _id_throwArrayIndexException = _class.instanceMethodId(
@@ -2249,44 +1904,6 @@
   }
 }
 
-final class $Exceptions$NullableType$ extends jni$_.JType<Exceptions?> {
-  @jni$_.internal
-  const $Exceptions$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Exceptions;';
-
-  @jni$_.internal
-  @core$_.override
-  Exceptions? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Exceptions.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Exceptions?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Exceptions$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Exceptions$NullableType$) &&
-        other is $Exceptions$NullableType$;
-  }
-}
-
 final class $Exceptions$Type$ extends jni$_.JType<Exceptions> {
   @jni$_.internal
   const $Exceptions$Type$();
@@ -2295,56 +1912,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Exceptions;';
-
-  @jni$_.internal
-  @core$_.override
-  Exceptions fromReference(jni$_.JReference reference) =>
-      Exceptions.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Exceptions?> get nullableType =>
-      const $Exceptions$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Exceptions$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Exceptions$Type$) &&
-        other is $Exceptions$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Fields$Nested`
-class Fields$Nested extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Fields$Nested> $type;
-
-  @jni$_.internal
-  Fields$Nested.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Fields$Nested._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Fields$Nested');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Fields$Nested?> nullableType =
-      $Fields$Nested$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Fields$Nested> type = $Fields$Nested$Type$();
   static final _id_hundred = _class.instanceFieldId(
     r'hundred',
@@ -2352,11 +1927,10 @@
   );
 
   /// from: `public long hundred`
-  int get hundred => _id_hundred.get(this, const jni$_.jlongType());
+  int get hundred => _id_hundred.get(this, jni$_.jlong.type);
 
   /// from: `public long hundred`
-  set hundred(int value) =>
-      _id_hundred.set(this, const jni$_.jlongType(), value);
+  set hundred(int value) => _id_hundred.set(this, jni$_.jlong.type, value);
 
   static final _id_BEST_GOD = _class.staticFieldId(
     r'BEST_GOD',
@@ -2366,12 +1940,12 @@
   /// from: `static public java.lang.String BEST_GOD`
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JString? get BEST_GOD =>
-      _id_BEST_GOD.get(_class, const jni$_.$JString$NullableType$());
+      _id_BEST_GOD.get(_class, const jni$_.$JObject$NullableType$());
 
   /// from: `static public java.lang.String BEST_GOD`
   /// The returned object must be released after use, by calling the [release] method.
   static set BEST_GOD(jni$_.JString? value) =>
-      _id_BEST_GOD.set(_class, const jni$_.$JString$NullableType$(), value);
+      _id_BEST_GOD.set(_class, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -2392,47 +1966,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory Fields$Nested() {
-    return Fields$Nested.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $Fields$Nested$NullableType$ extends jni$_.JType<Fields$Nested?> {
-  @jni$_.internal
-  const $Fields$Nested$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Fields$Nested;';
-
-  @jni$_.internal
-  @core$_.override
-  Fields$Nested? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Fields$Nested.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Fields$Nested?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Fields$Nested$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Fields$Nested$NullableType$) &&
-        other is $Fields$Nested$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<Fields$Nested>();
   }
 }
 
@@ -2444,55 +1979,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Fields$Nested;';
-
-  @jni$_.internal
-  @core$_.override
-  Fields$Nested fromReference(jni$_.JReference reference) =>
-      Fields$Nested.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Fields$Nested?> get nullableType =>
-      const $Fields$Nested$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Fields$Nested$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Fields$Nested$Type$) &&
-        other is $Fields$Nested$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.simple_package.Fields`
-class Fields extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Fields> $type;
-
-  @jni$_.internal
-  Fields.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Fields._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/simple_package/Fields');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Fields?> nullableType = $Fields$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Fields> type = $Fields$Type$();
   static final _id_amount = _class.staticFieldId(
     r'amount',
@@ -2500,11 +1994,11 @@
   );
 
   /// from: `static public int amount`
-  static int get amount => _id_amount.get(_class, const jni$_.jintType());
+  static int get amount => _id_amount.get(_class, jni$_.jint.type);
 
   /// from: `static public int amount`
   static set amount(int value) =>
-      _id_amount.set(_class, const jni$_.jintType(), value);
+      _id_amount.set(_class, jni$_.jint.type, value);
 
   static final _id_pi = _class.staticFieldId(
     r'pi',
@@ -2512,11 +2006,10 @@
   );
 
   /// from: `static public double pi`
-  static double get pi => _id_pi.get(_class, const jni$_.jdoubleType());
+  static double get pi => _id_pi.get(_class, jni$_.jdouble.type);
 
   /// from: `static public double pi`
-  static set pi(double value) =>
-      _id_pi.set(_class, const jni$_.jdoubleType(), value);
+  static set pi(double value) => _id_pi.set(_class, jni$_.jdouble.type, value);
 
   static final _id_asterisk = _class.staticFieldId(
     r'asterisk',
@@ -2524,11 +2017,11 @@
   );
 
   /// from: `static public char asterisk`
-  static int get asterisk => _id_asterisk.get(_class, const jni$_.jcharType());
+  static int get asterisk => _id_asterisk.get(_class, jni$_.jchar.type);
 
   /// from: `static public char asterisk`
   static set asterisk(int value) =>
-      _id_asterisk.set(_class, const jni$_.jcharType(), value);
+      _id_asterisk.set(_class, jni$_.jchar.type, value);
 
   static final _id_name = _class.staticFieldId(
     r'name',
@@ -2538,12 +2031,12 @@
   /// from: `static public java.lang.String name`
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JString? get name =>
-      _id_name.get(_class, const jni$_.$JString$NullableType$());
+      _id_name.get(_class, const jni$_.$JObject$NullableType$());
 
   /// from: `static public java.lang.String name`
   /// The returned object must be released after use, by calling the [release] method.
   static set name(jni$_.JString? value) =>
-      _id_name.set(_class, const jni$_.$JString$NullableType$(), value);
+      _id_name.set(_class, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_i = _class.instanceFieldId(
     r'i',
@@ -2553,12 +2046,12 @@
   /// from: `public java.lang.Integer i`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JInteger? get i =>
-      _id_i.get(this, const jni$_.$JInteger$NullableType$());
+      _id_i.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public java.lang.Integer i`
   /// The returned object must be released after use, by calling the [release] method.
   set i(jni$_.JInteger? value) =>
-      _id_i.set(this, const jni$_.$JInteger$NullableType$(), value);
+      _id_i.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_trillion = _class.instanceFieldId(
     r'trillion',
@@ -2566,11 +2059,10 @@
   );
 
   /// from: `public long trillion`
-  int get trillion => _id_trillion.get(this, const jni$_.jlongType());
+  int get trillion => _id_trillion.get(this, jni$_.jlong.type);
 
   /// from: `public long trillion`
-  set trillion(int value) =>
-      _id_trillion.set(this, const jni$_.jlongType(), value);
+  set trillion(int value) => _id_trillion.set(this, jni$_.jlong.type, value);
 
   static final _id_isAchillesDead = _class.instanceFieldId(
     r'isAchillesDead',
@@ -2578,12 +2070,11 @@
   );
 
   /// from: `public boolean isAchillesDead`
-  bool get isAchillesDead =>
-      _id_isAchillesDead.get(this, const jni$_.jbooleanType());
+  bool get isAchillesDead => _id_isAchillesDead.get(this, jni$_.jboolean.type);
 
   /// from: `public boolean isAchillesDead`
   set isAchillesDead(bool value) =>
-      _id_isAchillesDead.set(this, const jni$_.jbooleanType(), value);
+      _id_isAchillesDead.set(this, jni$_.jboolean.type, value);
 
   static final _id_bestFighterInGreece = _class.instanceFieldId(
     r'bestFighterInGreece',
@@ -2593,12 +2084,12 @@
   /// from: `public java.lang.String bestFighterInGreece`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString? get bestFighterInGreece =>
-      _id_bestFighterInGreece.get(this, const jni$_.$JString$NullableType$());
+      _id_bestFighterInGreece.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public java.lang.String bestFighterInGreece`
   /// The returned object must be released after use, by calling the [release] method.
   set bestFighterInGreece(jni$_.JString? value) => _id_bestFighterInGreece.set(
-      this, const jni$_.$JString$NullableType$(), value);
+      this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_random = _class.instanceFieldId(
     r'random',
@@ -2621,12 +2112,11 @@
   );
 
   /// from: `static public char euroSymbol`
-  static int get euroSymbol =>
-      _id_euroSymbol.get(_class, const jni$_.jcharType());
+  static int get euroSymbol => _id_euroSymbol.get(_class, jni$_.jchar.type);
 
   /// from: `static public char euroSymbol`
   static set euroSymbol(int value) =>
-      _id_euroSymbol.set(_class, const jni$_.jcharType(), value);
+      _id_euroSymbol.set(_class, jni$_.jchar.type, value);
 
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -2647,47 +2137,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory Fields() {
-    return Fields.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $Fields$NullableType$ extends jni$_.JType<Fields?> {
-  @jni$_.internal
-  const $Fields$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/simple_package/Fields;';
-
-  @jni$_.internal
-  @core$_.override
-  Fields? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Fields.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Fields?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Fields$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Fields$NullableType$) &&
-        other is $Fields$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<Fields>();
   }
 }
 
@@ -2699,52 +2150,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/simple_package/Fields;';
-
-  @jni$_.internal
-  @core$_.override
-  Fields fromReference(jni$_.JReference reference) => Fields.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Fields?> get nullableType => const $Fields$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Fields$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Fields$Type$) && other is $Fields$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.pkg2.C2`
-class C2 extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<C2> $type;
-
-  @jni$_.internal
-  C2.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type C2._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/pkg2/C2');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<C2?> nullableType = $C2$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<C2> type = $C2$Type$();
   static final _id_CONSTANT = _class.staticFieldId(
     r'CONSTANT',
@@ -2752,11 +2165,11 @@
   );
 
   /// from: `static public int CONSTANT`
-  static int get CONSTANT => _id_CONSTANT.get(_class, const jni$_.jintType());
+  static int get CONSTANT => _id_CONSTANT.get(_class, jni$_.jint.type);
 
   /// from: `static public int CONSTANT`
   static set CONSTANT(int value) =>
-      _id_CONSTANT.set(_class, const jni$_.jintType(), value);
+      _id_CONSTANT.set(_class, jni$_.jint.type, value);
 
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -2777,46 +2190,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory C2() {
-    return C2.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $C2$NullableType$ extends jni$_.JType<C2?> {
-  @jni$_.internal
-  const $C2$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/pkg2/C2;';
-
-  @jni$_.internal
-  @core$_.override
-  C2? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : C2.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<C2?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($C2$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($C2$NullableType$) &&
-        other is $C2$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<C2>();
   }
 }
 
@@ -2827,53 +2202,14 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/pkg2/C2;';
-
-  @jni$_.internal
-  @core$_.override
-  C2 fromReference(jni$_.JReference reference) => C2.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<C2?> get nullableType => const $C2$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($C2$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($C2$Type$) && other is $C2$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.pkg2.Example`
-class Example$1 extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Example$1> $type;
-
-  @jni$_.internal
-  Example$1.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Example$1._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/pkg2/Example');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Example$1?> nullableType =
-      $Example$1$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Example$1> type = $Example$1$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -2894,9 +2230,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory Example$1() {
-    return Example$1.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<Example$1>();
   }
 
   static final _id_whichExample = _class.instanceMethodId(
@@ -2924,43 +2259,6 @@
   }
 }
 
-final class $Example$1$NullableType$ extends jni$_.JType<Example$1?> {
-  @jni$_.internal
-  const $Example$1$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/pkg2/Example;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$1? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Example$1.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$1?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$1$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$1$NullableType$) &&
-        other is $Example$1$NullableType$;
-  }
-}
-
 final class $Example$1$Type$ extends jni$_.JType<Example$1> {
   @jni$_.internal
   const $Example$1$Type$();
@@ -2968,54 +2266,14 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/pkg2/Example;';
-
-  @jni$_.internal
-  @core$_.override
-  Example$1 fromReference(jni$_.JReference reference) =>
-      Example$1.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Example$1?> get nullableType => const $Example$1$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Example$1$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Example$1$Type$) && other is $Example$1$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.enums.Colors$RGB`
-class Colors$RGB extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Colors$RGB> $type;
-
-  @jni$_.internal
-  Colors$RGB.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Colors$RGB._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/enums/Colors$RGB');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Colors$RGB?> nullableType =
-      $Colors$RGB$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Colors$RGB> type = $Colors$RGB$Type$();
   static final _id_red = _class.instanceFieldId(
     r'red',
@@ -3023,10 +2281,10 @@
   );
 
   /// from: `public int red`
-  int get red => _id_red.get(this, const jni$_.jintType());
+  int get red => _id_red.get(this, jni$_.jint.type);
 
   /// from: `public int red`
-  set red(int value) => _id_red.set(this, const jni$_.jintType(), value);
+  set red(int value) => _id_red.set(this, jni$_.jint.type, value);
 
   static final _id_green = _class.instanceFieldId(
     r'green',
@@ -3034,10 +2292,10 @@
   );
 
   /// from: `public int green`
-  int get green => _id_green.get(this, const jni$_.jintType());
+  int get green => _id_green.get(this, jni$_.jint.type);
 
   /// from: `public int green`
-  set green(int value) => _id_green.set(this, const jni$_.jintType(), value);
+  set green(int value) => _id_green.set(this, jni$_.jint.type, value);
 
   static final _id_blue = _class.instanceFieldId(
     r'blue',
@@ -3045,10 +2303,10 @@
   );
 
   /// from: `public int blue`
-  int get blue => _id_blue.get(this, const jni$_.jintType());
+  int get blue => _id_blue.get(this, jni$_.jint.type);
 
   /// from: `public int blue`
-  set blue(int value) => _id_blue.set(this, const jni$_.jintType(), value);
+  set blue(int value) => _id_blue.set(this, jni$_.jint.type, value);
 
   static final _id_new$ = _class.constructorId(
     r'(III)V',
@@ -3072,9 +2330,9 @@
     int i1,
     int i2,
   ) {
-    return Colors$RGB.fromReference(_new$(
+    return _new$(
             _class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr, i, i1, i2)
-        .reference);
+        .object<Colors$RGB>();
   }
 
   static final _id_equals = _class.instanceMethodId(
@@ -3127,43 +2385,6 @@
   }
 }
 
-final class $Colors$RGB$NullableType$ extends jni$_.JType<Colors$RGB?> {
-  @jni$_.internal
-  const $Colors$RGB$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/enums/Colors$RGB;';
-
-  @jni$_.internal
-  @core$_.override
-  Colors$RGB? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Colors$RGB.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Colors$RGB?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Colors$RGB$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Colors$RGB$NullableType$) &&
-        other is $Colors$RGB$NullableType$;
-  }
-}
-
 final class $Colors$RGB$Type$ extends jni$_.JType<Colors$RGB> {
   @jni$_.internal
   const $Colors$RGB$Type$();
@@ -3171,55 +2392,14 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/enums/Colors$RGB;';
-
-  @jni$_.internal
-  @core$_.override
-  Colors$RGB fromReference(jni$_.JReference reference) =>
-      Colors$RGB.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Colors$RGB?> get nullableType =>
-      const $Colors$RGB$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Colors$RGB$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Colors$RGB$Type$) &&
-        other is $Colors$RGB$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.enums.Colors`
-class Colors extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Colors> $type;
-
-  @jni$_.internal
-  Colors.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Colors._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/enums/Colors');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Colors?> nullableType = $Colors$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Colors> type = $Colors$Type$();
   static final _id_red = _class.staticFieldId(
     r'red',
@@ -3228,7 +2408,8 @@
 
   /// from: `static public final com.github.dart_lang.jnigen.enums.Colors red`
   /// The returned object must be released after use, by calling the [release] method.
-  static Colors get red => _id_red.get(_class, const $Colors$Type$());
+  static Colors get red =>
+      _id_red.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_green = _class.staticFieldId(
     r'green',
@@ -3237,7 +2418,8 @@
 
   /// from: `static public final com.github.dart_lang.jnigen.enums.Colors green`
   /// The returned object must be released after use, by calling the [release] method.
-  static Colors get green => _id_green.get(_class, const $Colors$Type$());
+  static Colors get green =>
+      _id_green.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_blue = _class.staticFieldId(
     r'blue',
@@ -3246,7 +2428,8 @@
 
   /// from: `static public final com.github.dart_lang.jnigen.enums.Colors blue`
   /// The returned object must be released after use, by calling the [release] method.
-  static Colors get blue => _id_blue.get(_class, const $Colors$Type$());
+  static Colors get blue =>
+      _id_blue.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_code = _class.instanceFieldId(
     r'code',
@@ -3254,7 +2437,7 @@
   );
 
   /// from: `public final int code`
-  int get code => _id_code.get(this, const jni$_.jintType());
+  int get code => _id_code.get(this, jni$_.jint.type);
 
   static final _id_values = _class.staticMethodId(
     r'values',
@@ -3277,9 +2460,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JArray<Colors?>? values() {
     return _values(_class.reference.pointer, _id_values as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<Colors?>?>(
-            const jni$_.$JArray$NullableType$<Colors?>(
-                $Colors$NullableType$()));
+        .object<jni$_.JArray<Colors?>?>();
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -3306,7 +2487,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _valueOf(_class.reference.pointer, _id_valueOf as jni$_.JMethodIDPtr,
             _$string.pointer)
-        .object<Colors?>(const $Colors$NullableType$());
+        .object<Colors?>();
   }
 
   static final _id_toRGB = _class.instanceMethodId(
@@ -3330,44 +2511,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   Colors$RGB? toRGB() {
     return _toRGB(reference.pointer, _id_toRGB as jni$_.JMethodIDPtr)
-        .object<Colors$RGB?>(const $Colors$RGB$NullableType$());
-  }
-}
-
-final class $Colors$NullableType$ extends jni$_.JType<Colors?> {
-  @jni$_.internal
-  const $Colors$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/enums/Colors;';
-
-  @jni$_.internal
-  @core$_.override
-  Colors? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Colors.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Colors?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Colors$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Colors$NullableType$) &&
-        other is $Colors$NullableType$;
+        .object<Colors$RGB?>();
   }
 }
 
@@ -3378,81 +2522,17 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/enums/Colors;';
-
-  @jni$_.internal
-  @core$_.override
-  Colors fromReference(jni$_.JReference reference) => Colors.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Colors?> get nullableType => const $Colors$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Colors$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Colors$Type$) && other is $Colors$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.GenericTypeParams`
-class GenericTypeParams<$S extends jni$_.JObject?, $K extends jni$_.JObject?>
-    extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GenericTypeParams<$S, $K>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  GenericTypeParams.fromReference(
-    this.S,
-    this.K,
-    jni$_.JReference reference,
-  )   : $type = type<$S, $K>(S, K),
-        super.fromReference(reference);
-
+extension type GenericTypeParams<$S extends jni$_.JObject?,
+        $K extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/GenericTypeParams');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GenericTypeParams<$S, $K>?>
-      nullableType<$S extends jni$_.JObject?, $K extends jni$_.JObject?>(
-    jni$_.JType<$S> S,
-    jni$_.JType<$K> K,
-  ) {
-    return $GenericTypeParams$NullableType$<$S, $K>(
-      S,
-      K,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GenericTypeParams<$S, $K>>
-      type<$S extends jni$_.JObject?, $K extends jni$_.JObject?>(
-    jni$_.JType<$S> S,
-    jni$_.JType<$K> K,
-  ) {
-    return $GenericTypeParams$Type$<$S, $K>(
-      S,
-      K,
-    );
-  }
-
+  static const jni$_.JType<GenericTypeParams> type = $GenericTypeParams$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -3471,185 +2551,32 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory GenericTypeParams({
-    required jni$_.JType<$S> S,
-    required jni$_.JType<$K> K,
-  }) {
-    return GenericTypeParams<$S, $K>.fromReference(
-        S,
-        K,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory GenericTypeParams() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<GenericTypeParams<$S, $K>>();
   }
 }
 
-final class $GenericTypeParams$NullableType$<$S extends jni$_.JObject?,
-    $K extends jni$_.JObject?> extends jni$_.JType<GenericTypeParams<$S, $K>?> {
+final class $GenericTypeParams$Type$ extends jni$_.JType<GenericTypeParams> {
   @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  const $GenericTypeParams$NullableType$(
-    this.S,
-    this.K,
-  );
+  const $GenericTypeParams$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/GenericTypeParams;';
-
-  @jni$_.internal
-  @core$_.override
-  GenericTypeParams<$S, $K>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GenericTypeParams<$S, $K>.fromReference(
-              S,
-              K,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GenericTypeParams<$S, $K>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GenericTypeParams$NullableType$, S, K);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GenericTypeParams$NullableType$<$S, $K>) &&
-        other is $GenericTypeParams$NullableType$<$S, $K> &&
-        S == other.S &&
-        K == other.K;
-  }
-}
-
-final class $GenericTypeParams$Type$<$S extends jni$_.JObject?,
-    $K extends jni$_.JObject?> extends jni$_.JType<GenericTypeParams<$S, $K>> {
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  const $GenericTypeParams$Type$(
-    this.S,
-    this.K,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/GenericTypeParams;';
-
-  @jni$_.internal
-  @core$_.override
-  GenericTypeParams<$S, $K> fromReference(jni$_.JReference reference) =>
-      GenericTypeParams<$S, $K>.fromReference(
-        S,
-        K,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GenericTypeParams<$S, $K>?> get nullableType =>
-      $GenericTypeParams$NullableType$<$S, $K>(S, K);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GenericTypeParams$Type$, S, K);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GenericTypeParams$Type$<$S, $K>) &&
-        other is $GenericTypeParams$Type$<$S, $K> &&
-        S == other.S &&
-        K == other.K;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.GrandParent$Parent$Child`
-class GrandParent$Parent$Child<
-    $T extends jni$_.JObject?,
-    $S extends jni$_.JObject?,
-    $U extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  GrandParent$Parent$Child.fromReference(
-    this.T,
-    this.S,
-    this.U,
-    jni$_.JReference reference,
-  )   : $type = type<$T, $S, $U>(T, S, U),
-        super.fromReference(reference);
-
+extension type GrandParent$Parent$Child<$T extends jni$_.JObject?,
+        $S extends jni$_.JObject?, $U extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/GrandParent$Parent$Child');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>?> nullableType<
-      $T extends jni$_.JObject?,
-      $S extends jni$_.JObject?,
-      $U extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$S> S,
-    jni$_.JType<$U> U,
-  ) {
-    return $GrandParent$Parent$Child$NullableType$<$T, $S, $U>(
-      T,
-      S,
-      U,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>> type<
-      $T extends jni$_.JObject?,
-      $S extends jni$_.JObject?,
-      $U extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$S> S,
-    jni$_.JType<$U> U,
-  ) {
-    return $GrandParent$Parent$Child$Type$<$T, $S, $U>(
-      T,
-      S,
-      U,
-    );
-  }
-
+  static const jni$_.JType<GrandParent$Parent$Child> type =
+      $GrandParent$Parent$Child$Type$();
   static final _id_grandParentValue = _class.instanceFieldId(
     r'grandParentValue',
     r'Ljava/lang/Object;',
@@ -3657,12 +2584,13 @@
 
   /// from: `public T grandParentValue`
   /// The returned object must be released after use, by calling the [release] method.
-  $T? get grandParentValue => _id_grandParentValue.get(this, T.nullableType);
+  $T? get grandParentValue =>
+      _id_grandParentValue.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public T grandParentValue`
   /// The returned object must be released after use, by calling the [release] method.
-  set grandParentValue($T? value) =>
-      _id_grandParentValue.set(this, T.nullableType, value);
+  set grandParentValue($T? value) => _id_grandParentValue.set(
+      this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_parentValue = _class.instanceFieldId(
     r'parentValue',
@@ -3671,12 +2599,13 @@
 
   /// from: `public S parentValue`
   /// The returned object must be released after use, by calling the [release] method.
-  $S? get parentValue => _id_parentValue.get(this, S.nullableType);
+  $S? get parentValue =>
+      _id_parentValue.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public S parentValue`
   /// The returned object must be released after use, by calling the [release] method.
   set parentValue($S? value) =>
-      _id_parentValue.set(this, S.nullableType, value);
+      _id_parentValue.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_value = _class.instanceFieldId(
     r'value',
@@ -3685,11 +2614,12 @@
 
   /// from: `public U value`
   /// The returned object must be released after use, by calling the [release] method.
-  $U? get value => _id_value.get(this, U.nullableType);
+  $U? get value => _id_value.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public U value`
   /// The returned object must be released after use, by calling the [release] method.
-  set value($U? value) => _id_value.set(this, U.nullableType, value);
+  set value($U? value) =>
+      _id_value.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;Ljava/lang/Object;)V',
@@ -3716,204 +2646,37 @@
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent$Parent$Child(
     GrandParent$Parent<$T?, $S?> $outerClass,
-    $U? object, {
-    jni$_.JType<$T>? T,
-    jni$_.JType<$S>? S,
-    required jni$_.JType<$U> U,
-  }) {
-    T ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type
-              as $GrandParent$Parent$Type$<core$_.dynamic, core$_.dynamic>)
-          .T,
-    ]) as jni$_.JType<$T>;
-    S ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type
-              as $GrandParent$Parent$Type$<core$_.dynamic, core$_.dynamic>)
-          .S,
-    ]) as jni$_.JType<$S>;
+    $U? object,
+  ) {
     final _$$outerClass = $outerClass.reference;
     final _$object = object?.reference ?? jni$_.jNullReference;
-    return GrandParent$Parent$Child<$T, $S, $U>.fromReference(
-        T,
-        S,
-        U,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$$outerClass.pointer, _$object.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer, _$object.pointer)
+        .object<GrandParent$Parent$Child<$T, $S, $U>>();
   }
 }
 
-final class $GrandParent$Parent$Child$NullableType$<$T extends jni$_.JObject?,
-        $S extends jni$_.JObject?, $U extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>?> {
+final class $GrandParent$Parent$Child$Type$
+    extends jni$_.JType<GrandParent$Parent$Child> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  const $GrandParent$Parent$Child$NullableType$(
-    this.T,
-    this.S,
-    this.U,
-  );
+  const $GrandParent$Parent$Child$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$Parent$Child<$T, $S, $U>? fromReference(
-          jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GrandParent$Parent$Child<$T, $S, $U>.fromReference(
-              T,
-              S,
-              U,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode =>
-      Object.hash($GrandParent$Parent$Child$NullableType$, T, S, U);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType ==
-            ($GrandParent$Parent$Child$NullableType$<$T, $S, $U>) &&
-        other is $GrandParent$Parent$Child$NullableType$<$T, $S, $U> &&
-        T == other.T &&
-        S == other.S &&
-        U == other.U;
-  }
-}
-
-final class $GrandParent$Parent$Child$Type$<$T extends jni$_.JObject?,
-        $S extends jni$_.JObject?, $U extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  const $GrandParent$Parent$Child$Type$(
-    this.T,
-    this.S,
-    this.U,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$Parent$Child<$T, $S, $U> fromReference(
-          jni$_.JReference reference) =>
-      GrandParent$Parent$Child<$T, $S, $U>.fromReference(
-        T,
-        S,
-        U,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$Parent$Child<$T, $S, $U>?> get nullableType =>
-      $GrandParent$Parent$Child$NullableType$<$T, $S, $U>(T, S, U);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$Parent$Child$Type$, T, S, U);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$Parent$Child$Type$<$T, $S, $U>) &&
-        other is $GrandParent$Parent$Child$Type$<$T, $S, $U> &&
-        T == other.T &&
-        S == other.S &&
-        U == other.U;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.GrandParent$Parent`
-class GrandParent$Parent<$T extends jni$_.JObject?, $S extends jni$_.JObject?>
-    extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GrandParent$Parent<$T, $S>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  GrandParent$Parent.fromReference(
-    this.T,
-    this.S,
-    jni$_.JReference reference,
-  )   : $type = type<$T, $S>(T, S),
-        super.fromReference(reference);
-
+extension type GrandParent$Parent<$T extends jni$_.JObject?,
+        $S extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/GrandParent$Parent');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$Parent<$T, $S>?>
-      nullableType<$T extends jni$_.JObject?, $S extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$S> S,
-  ) {
-    return $GrandParent$Parent$NullableType$<$T, $S>(
-      T,
-      S,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$Parent<$T, $S>>
-      type<$T extends jni$_.JObject?, $S extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$S> S,
-  ) {
-    return $GrandParent$Parent$Type$<$T, $S>(
-      T,
-      S,
-    );
-  }
-
+  static const jni$_.JType<GrandParent$Parent> type =
+      $GrandParent$Parent$Type$();
   static final _id_parentValue = _class.instanceFieldId(
     r'parentValue',
     r'Ljava/lang/Object;',
@@ -3921,12 +2684,13 @@
 
   /// from: `public T parentValue`
   /// The returned object must be released after use, by calling the [release] method.
-  $T? get parentValue => _id_parentValue.get(this, T.nullableType);
+  $T? get parentValue =>
+      _id_parentValue.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public T parentValue`
   /// The returned object must be released after use, by calling the [release] method.
   set parentValue($T? value) =>
-      _id_parentValue.set(this, T.nullableType, value);
+      _id_parentValue.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_value = _class.instanceFieldId(
     r'value',
@@ -3935,11 +2699,12 @@
 
   /// from: `public S value`
   /// The returned object must be released after use, by calling the [release] method.
-  $S? get value => _id_value.get(this, S.nullableType);
+  $S? get value => _id_value.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public S value`
   /// The returned object must be released after use, by calling the [release] method.
-  set value($S? value) => _id_value.set(this, S.nullableType, value);
+  set value($S? value) =>
+      _id_value.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Lcom/github/dart_lang/jnigen/generics/GrandParent;Ljava/lang/Object;)V',
@@ -3966,178 +2731,36 @@
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent$Parent(
     GrandParent<$T?> $outerClass,
-    $S? object, {
-    jni$_.JType<$T>? T,
-    required jni$_.JType<$S> S,
-  }) {
-    T ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $GrandParent$Type$<core$_.dynamic>).T,
-    ]) as jni$_.JType<$T>;
+    $S? object,
+  ) {
     final _$$outerClass = $outerClass.reference;
     final _$object = object?.reference ?? jni$_.jNullReference;
-    return GrandParent$Parent<$T, $S>.fromReference(
-        T,
-        S,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$$outerClass.pointer, _$object.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer, _$object.pointer)
+        .object<GrandParent$Parent<$T, $S>>();
   }
 }
 
-final class $GrandParent$Parent$NullableType$<$T extends jni$_.JObject?,
-        $S extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$Parent<$T, $S>?> {
+final class $GrandParent$Parent$Type$ extends jni$_.JType<GrandParent$Parent> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  const $GrandParent$Parent$NullableType$(
-    this.T,
-    this.S,
-  );
+  const $GrandParent$Parent$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$Parent<$T, $S>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GrandParent$Parent<$T, $S>.fromReference(
-              T,
-              S,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$Parent<$T, $S>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$Parent$NullableType$, T, S);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$Parent$NullableType$<$T, $S>) &&
-        other is $GrandParent$Parent$NullableType$<$T, $S> &&
-        T == other.T &&
-        S == other.S;
-  }
-}
-
-final class $GrandParent$Parent$Type$<$T extends jni$_.JObject?,
-    $S extends jni$_.JObject?> extends jni$_.JType<GrandParent$Parent<$T, $S>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  const $GrandParent$Parent$Type$(
-    this.T,
-    this.S,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/GrandParent$Parent;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$Parent<$T, $S> fromReference(jni$_.JReference reference) =>
-      GrandParent$Parent<$T, $S>.fromReference(
-        T,
-        S,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$Parent<$T, $S>?> get nullableType =>
-      $GrandParent$Parent$NullableType$<$T, $S>(T, S);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$Parent$Type$, T, S);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$Parent$Type$<$T, $S>) &&
-        other is $GrandParent$Parent$Type$<$T, $S> &&
-        T == other.T &&
-        S == other.S;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.GrandParent$StaticParent$Child`
-class GrandParent$StaticParent$Child<$S extends jni$_.JObject?,
-    $U extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GrandParent$StaticParent$Child<$S, $U>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  GrandParent$StaticParent$Child.fromReference(
-    this.S,
-    this.U,
-    jni$_.JReference reference,
-  )   : $type = type<$S, $U>(S, U),
-        super.fromReference(reference);
-
+extension type GrandParent$StaticParent$Child<$S extends jni$_.JObject?,
+        $U extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/GrandParent$StaticParent$Child');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$StaticParent$Child<$S, $U>?>
-      nullableType<$S extends jni$_.JObject?, $U extends jni$_.JObject?>(
-    jni$_.JType<$S> S,
-    jni$_.JType<$U> U,
-  ) {
-    return $GrandParent$StaticParent$Child$NullableType$<$S, $U>(
-      S,
-      U,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$StaticParent$Child<$S, $U>>
-      type<$S extends jni$_.JObject?, $U extends jni$_.JObject?>(
-    jni$_.JType<$S> S,
-    jni$_.JType<$U> U,
-  ) {
-    return $GrandParent$StaticParent$Child$Type$<$S, $U>(
-      S,
-      U,
-    );
-  }
-
+  static const jni$_.JType<GrandParent$StaticParent$Child> type =
+      $GrandParent$StaticParent$Child$Type$();
   static final _id_parentValue = _class.instanceFieldId(
     r'parentValue',
     r'Ljava/lang/Object;',
@@ -4145,12 +2768,13 @@
 
   /// from: `public S parentValue`
   /// The returned object must be released after use, by calling the [release] method.
-  $S? get parentValue => _id_parentValue.get(this, S.nullableType);
+  $S? get parentValue =>
+      _id_parentValue.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public S parentValue`
   /// The returned object must be released after use, by calling the [release] method.
   set parentValue($S? value) =>
-      _id_parentValue.set(this, S.nullableType, value);
+      _id_parentValue.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_value = _class.instanceFieldId(
     r'value',
@@ -4159,11 +2783,12 @@
 
   /// from: `public U value`
   /// The returned object must be released after use, by calling the [release] method.
-  $U? get value => _id_value.get(this, U.nullableType);
+  $U? get value => _id_value.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public U value`
   /// The returned object must be released after use, by calling the [release] method.
-  set value($U? value) => _id_value.set(this, U.nullableType, value);
+  set value($U? value) =>
+      _id_value.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;Ljava/lang/Object;Ljava/lang/Object;)V',
@@ -4193,177 +2818,37 @@
   factory GrandParent$StaticParent$Child(
     GrandParent$StaticParent<$S?> $outerClass,
     $S? object,
-    $U? object1, {
-    jni$_.JType<$S>? S,
-    required jni$_.JType<$U> U,
-  }) {
-    S ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $GrandParent$StaticParent$Type$<core$_.dynamic>).S,
-    ]) as jni$_.JType<$S>;
+    $U? object1,
+  ) {
     final _$$outerClass = $outerClass.reference;
     final _$object = object?.reference ?? jni$_.jNullReference;
     final _$object1 = object1?.reference ?? jni$_.jNullReference;
-    return GrandParent$StaticParent$Child<$S, $U>.fromReference(
-        S,
-        U,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$$outerClass.pointer, _$object.pointer, _$object1.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer, _$object.pointer, _$object1.pointer)
+        .object<GrandParent$StaticParent$Child<$S, $U>>();
   }
 }
 
-final class $GrandParent$StaticParent$Child$NullableType$<
-        $S extends jni$_.JObject?, $U extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$StaticParent$Child<$S, $U>?> {
+final class $GrandParent$StaticParent$Child$Type$
+    extends jni$_.JType<GrandParent$StaticParent$Child> {
   @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  const $GrandParent$StaticParent$Child$NullableType$(
-    this.S,
-    this.U,
-  );
+  const $GrandParent$StaticParent$Child$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$StaticParent$Child<$S, $U>? fromReference(
-          jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GrandParent$StaticParent$Child<$S, $U>.fromReference(
-              S,
-              U,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$StaticParent$Child<$S, $U>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode =>
-      Object.hash($GrandParent$StaticParent$Child$NullableType$, S, U);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType ==
-            ($GrandParent$StaticParent$Child$NullableType$<$S, $U>) &&
-        other is $GrandParent$StaticParent$Child$NullableType$<$S, $U> &&
-        S == other.S &&
-        U == other.U;
-  }
-}
-
-final class $GrandParent$StaticParent$Child$Type$<$S extends jni$_.JObject?,
-        $U extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$StaticParent$Child<$S, $U>> {
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  const $GrandParent$StaticParent$Child$Type$(
-    this.S,
-    this.U,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$StaticParent$Child<$S, $U> fromReference(
-          jni$_.JReference reference) =>
-      GrandParent$StaticParent$Child<$S, $U>.fromReference(
-        S,
-        U,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$StaticParent$Child<$S, $U>?> get nullableType =>
-      $GrandParent$StaticParent$Child$NullableType$<$S, $U>(S, U);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$StaticParent$Child$Type$, S, U);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType ==
-            ($GrandParent$StaticParent$Child$Type$<$S, $U>) &&
-        other is $GrandParent$StaticParent$Child$Type$<$S, $U> &&
-        S == other.S &&
-        U == other.U;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.GrandParent$StaticParent`
-class GrandParent$StaticParent<$S extends jni$_.JObject?>
-    extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GrandParent$StaticParent<$S>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  GrandParent$StaticParent.fromReference(
-    this.S,
-    jni$_.JReference reference,
-  )   : $type = type<$S>(S),
-        super.fromReference(reference);
-
+extension type GrandParent$StaticParent<$S extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/GrandParent$StaticParent');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$StaticParent<$S>?>
-      nullableType<$S extends jni$_.JObject?>(
-    jni$_.JType<$S> S,
-  ) {
-    return $GrandParent$StaticParent$NullableType$<$S>(
-      S,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent$StaticParent<$S>>
-      type<$S extends jni$_.JObject?>(
-    jni$_.JType<$S> S,
-  ) {
-    return $GrandParent$StaticParent$Type$<$S>(
-      S,
-    );
-  }
-
+  static const jni$_.JType<GrandParent$StaticParent> type =
+      $GrandParent$StaticParent$Type$();
   static final _id_value = _class.instanceFieldId(
     r'value',
     r'Ljava/lang/Object;',
@@ -4371,11 +2856,12 @@
 
   /// from: `public S value`
   /// The returned object must be released after use, by calling the [release] method.
-  $S? get value => _id_value.get(this, S.nullableType);
+  $S? get value => _id_value.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public S value`
   /// The returned object must be released after use, by calling the [release] method.
-  set value($S? value) => _id_value.set(this, S.nullableType, value);
+  set value($S? value) =>
+      _id_value.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Ljava/lang/Object;)V',
@@ -4395,148 +2881,34 @@
   /// from: `public void <init>(S object)`
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent$StaticParent(
-    $S? object, {
-    required jni$_.JType<$S> S,
-  }) {
+    $S? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
-    return GrandParent$StaticParent<$S>.fromReference(
-        S,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$object.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .object<GrandParent$StaticParent<$S>>();
   }
 }
 
-final class $GrandParent$StaticParent$NullableType$<$S extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$StaticParent<$S>?> {
+final class $GrandParent$StaticParent$Type$
+    extends jni$_.JType<GrandParent$StaticParent> {
   @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  const $GrandParent$StaticParent$NullableType$(
-    this.S,
-  );
+  const $GrandParent$StaticParent$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$StaticParent<$S>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GrandParent$StaticParent<$S>.fromReference(
-              S,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$StaticParent<$S>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$StaticParent$NullableType$, S);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$StaticParent$NullableType$<$S>) &&
-        other is $GrandParent$StaticParent$NullableType$<$S> &&
-        S == other.S;
-  }
-}
-
-final class $GrandParent$StaticParent$Type$<$S extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent$StaticParent<$S>> {
-  @jni$_.internal
-  final jni$_.JType<$S> S;
-
-  @jni$_.internal
-  const $GrandParent$StaticParent$Type$(
-    this.S,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/GrandParent$StaticParent;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent$StaticParent<$S> fromReference(jni$_.JReference reference) =>
-      GrandParent$StaticParent<$S>.fromReference(
-        S,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent$StaticParent<$S>?> get nullableType =>
-      $GrandParent$StaticParent$NullableType$<$S>(S);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$StaticParent$Type$, S);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$StaticParent$Type$<$S>) &&
-        other is $GrandParent$StaticParent$Type$<$S> &&
-        S == other.S;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.GrandParent`
-class GrandParent<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GrandParent<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  GrandParent.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type GrandParent<$T extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/generics/GrandParent');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent<$T>?> nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $GrandParent$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GrandParent<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $GrandParent$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<GrandParent> type = $GrandParent$Type$();
   static final _id_value = _class.instanceFieldId(
     r'value',
     r'Ljava/lang/Object;',
@@ -4544,11 +2916,12 @@
 
   /// from: `public T value`
   /// The returned object must be released after use, by calling the [release] method.
-  $T? get value => _id_value.get(this, T.nullableType);
+  $T? get value => _id_value.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public T value`
   /// The returned object must be released after use, by calling the [release] method.
-  set value($T? value) => _id_value.set(this, T.nullableType, value);
+  set value($T? value) =>
+      _id_value.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Ljava/lang/Object;)V',
@@ -4568,15 +2941,12 @@
   /// from: `public void <init>(T object)`
   /// The returned object must be released after use, by calling the [release] method.
   factory GrandParent(
-    $T? object, {
-    required jni$_.JType<$T> T,
-  }) {
+    $T? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
-    return GrandParent<$T>.fromReference(
-        T,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$object.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$object.pointer)
+        .object<GrandParent<$T>>();
   }
 
   static final _id_stringParent = _class.instanceMethodId(
@@ -4601,9 +2971,7 @@
   GrandParent$Parent<$T?, jni$_.JString?>? stringParent() {
     return _stringParent(
             reference.pointer, _id_stringParent as jni$_.JMethodIDPtr)
-        .object<GrandParent$Parent<$T?, jni$_.JString?>?>(
-            $GrandParent$Parent$NullableType$<$T?, jni$_.JString?>(
-                T.nullableType, const jni$_.$JString$NullableType$()));
+        .object<GrandParent$Parent<$T?, jni$_.JString?>?>();
   }
 
   static final _id_varParent = _class.instanceMethodId(
@@ -4625,15 +2993,12 @@
   /// from: `public com.github.dart_lang.jnigen.generics.GrandParent$Parent<T, S> varParent(S object)`
   /// The returned object must be released after use, by calling the [release] method.
   GrandParent$Parent<$T?, $S?>? varParent<$S extends jni$_.JObject?>(
-    $S? object, {
-    required jni$_.JType<$S> S,
-  }) {
+    $S? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _varParent(reference.pointer, _id_varParent as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<GrandParent$Parent<$T?, $S?>?>(
-            $GrandParent$Parent$NullableType$<$T?, $S?>(
-                T.nullableType, S.nullableType));
+        .object<GrandParent$Parent<$T?, $S?>?>();
   }
 
   static final _id_stringStaticParent = _class.staticMethodId(
@@ -4658,9 +3023,7 @@
   static GrandParent$StaticParent<jni$_.JString?>? stringStaticParent() {
     return _stringStaticParent(_class.reference.pointer,
             _id_stringStaticParent as jni$_.JMethodIDPtr)
-        .object<GrandParent$StaticParent<jni$_.JString?>?>(
-            const $GrandParent$StaticParent$NullableType$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<GrandParent$StaticParent<jni$_.JString?>?>();
   }
 
   static final _id_varStaticParent = _class.staticMethodId(
@@ -4683,14 +3046,12 @@
   /// The returned object must be released after use, by calling the [release] method.
   static GrandParent$StaticParent<$S?>?
       varStaticParent<$S extends jni$_.JObject?>(
-    $S? object, {
-    required jni$_.JType<$S> S,
-  }) {
+    $S? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _varStaticParent(_class.reference.pointer,
             _id_varStaticParent as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<GrandParent$StaticParent<$S?>?>(
-            $GrandParent$StaticParent$NullableType$<$S?>(S.nullableType));
+        .object<GrandParent$StaticParent<$S?>?>();
   }
 
   static final _id_staticParentWithSameType = _class.instanceMethodId(
@@ -4715,149 +3076,28 @@
   GrandParent$StaticParent<$T?>? staticParentWithSameType() {
     return _staticParentWithSameType(reference.pointer,
             _id_staticParentWithSameType as jni$_.JMethodIDPtr)
-        .object<GrandParent$StaticParent<$T?>?>(
-            $GrandParent$StaticParent$NullableType$<$T?>(T.nullableType));
+        .object<GrandParent$StaticParent<$T?>?>();
   }
 }
 
-final class $GrandParent$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent<$T>?> {
+final class $GrandParent$Type$ extends jni$_.JType<GrandParent> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $GrandParent$NullableType$(
-    this.T,
-  );
+  const $GrandParent$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/generics/GrandParent;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : GrandParent<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$NullableType$<$T>) &&
-        other is $GrandParent$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $GrandParent$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<GrandParent<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $GrandParent$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/generics/GrandParent;';
-
-  @jni$_.internal
-  @core$_.override
-  GrandParent<$T> fromReference(jni$_.JReference reference) =>
-      GrandParent<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GrandParent<$T>?> get nullableType =>
-      $GrandParent$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GrandParent$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GrandParent$Type$<$T>) &&
-        other is $GrandParent$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.MyMap$MyEntry`
-class MyMap$MyEntry<$K extends jni$_.JObject?, $V extends jni$_.JObject?>
-    extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyMap$MyEntry<$K, $V>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  MyMap$MyEntry.fromReference(
-    this.K,
-    this.V,
-    jni$_.JReference reference,
-  )   : $type = type<$K, $V>(K, V),
-        super.fromReference(reference);
-
+extension type MyMap$MyEntry<$K extends jni$_.JObject?,
+        $V extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/MyMap$MyEntry');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyMap$MyEntry<$K, $V>?>
-      nullableType<$K extends jni$_.JObject?, $V extends jni$_.JObject?>(
-    jni$_.JType<$K> K,
-    jni$_.JType<$V> V,
-  ) {
-    return $MyMap$MyEntry$NullableType$<$K, $V>(
-      K,
-      V,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyMap$MyEntry<$K, $V>>
-      type<$K extends jni$_.JObject?, $V extends jni$_.JObject?>(
-    jni$_.JType<$K> K,
-    jni$_.JType<$V> V,
-  ) {
-    return $MyMap$MyEntry$Type$<$K, $V>(
-      K,
-      V,
-    );
-  }
-
+  static const jni$_.JType<MyMap$MyEntry> type = $MyMap$MyEntry$Type$();
   static final _id_key = _class.instanceFieldId(
     r'key',
     r'Ljava/lang/Object;',
@@ -4865,11 +3105,12 @@
 
   /// from: `public K key`
   /// The returned object must be released after use, by calling the [release] method.
-  $K? get key => _id_key.get(this, K.nullableType);
+  $K? get key => _id_key.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public K key`
   /// The returned object must be released after use, by calling the [release] method.
-  set key($K? value) => _id_key.set(this, K.nullableType, value);
+  set key($K? value) =>
+      _id_key.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_value = _class.instanceFieldId(
     r'value',
@@ -4878,11 +3119,12 @@
 
   /// from: `public V value`
   /// The returned object must be released after use, by calling the [release] method.
-  $V? get value => _id_value.get(this, V.nullableType);
+  $V? get value => _id_value.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public V value`
   /// The returned object must be released after use, by calling the [release] method.
-  set value($V? value) => _id_value.set(this, V.nullableType, value);
+  set value($V? value) =>
+      _id_value.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Lcom/github/dart_lang/jnigen/generics/MyMap;Ljava/lang/Object;Ljava/lang/Object;)V',
@@ -4912,181 +3154,35 @@
   factory MyMap$MyEntry(
     MyMap<$K?, $V?> $outerClass,
     $K? object,
-    $V? object1, {
-    jni$_.JType<$K>? K,
-    jni$_.JType<$V>? V,
-  }) {
-    K ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $MyMap$Type$<core$_.dynamic, core$_.dynamic>).K,
-    ]) as jni$_.JType<$K>;
-    V ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $MyMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    $V? object1,
+  ) {
     final _$$outerClass = $outerClass.reference;
     final _$object = object?.reference ?? jni$_.jNullReference;
     final _$object1 = object1?.reference ?? jni$_.jNullReference;
-    return MyMap$MyEntry<$K, $V>.fromReference(
-        K,
-        V,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$$outerClass.pointer, _$object.pointer, _$object1.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer, _$object.pointer, _$object1.pointer)
+        .object<MyMap$MyEntry<$K, $V>>();
   }
 }
 
-final class $MyMap$MyEntry$NullableType$<$K extends jni$_.JObject?,
-    $V extends jni$_.JObject?> extends jni$_.JType<MyMap$MyEntry<$K, $V>?> {
+final class $MyMap$MyEntry$Type$ extends jni$_.JType<MyMap$MyEntry> {
   @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $MyMap$MyEntry$NullableType$(
-    this.K,
-    this.V,
-  );
+  const $MyMap$MyEntry$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/MyMap$MyEntry;';
-
-  @jni$_.internal
-  @core$_.override
-  MyMap$MyEntry<$K, $V>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : MyMap$MyEntry<$K, $V>.fromReference(
-              K,
-              V,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyMap$MyEntry<$K, $V>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyMap$MyEntry$NullableType$, K, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyMap$MyEntry$NullableType$<$K, $V>) &&
-        other is $MyMap$MyEntry$NullableType$<$K, $V> &&
-        K == other.K &&
-        V == other.V;
-  }
-}
-
-final class $MyMap$MyEntry$Type$<$K extends jni$_.JObject?,
-    $V extends jni$_.JObject?> extends jni$_.JType<MyMap$MyEntry<$K, $V>> {
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $MyMap$MyEntry$Type$(
-    this.K,
-    this.V,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/MyMap$MyEntry;';
-
-  @jni$_.internal
-  @core$_.override
-  MyMap$MyEntry<$K, $V> fromReference(jni$_.JReference reference) =>
-      MyMap$MyEntry<$K, $V>.fromReference(
-        K,
-        V,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyMap$MyEntry<$K, $V>?> get nullableType =>
-      $MyMap$MyEntry$NullableType$<$K, $V>(K, V);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyMap$MyEntry$Type$, K, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyMap$MyEntry$Type$<$K, $V>) &&
-        other is $MyMap$MyEntry$Type$<$K, $V> &&
-        K == other.K &&
-        V == other.V;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.MyMap`
-class MyMap<$K extends jni$_.JObject?, $V extends jni$_.JObject?>
-    extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyMap<$K, $V>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  MyMap.fromReference(
-    this.K,
-    this.V,
-    jni$_.JReference reference,
-  )   : $type = type<$K, $V>(K, V),
-        super.fromReference(reference);
-
+extension type MyMap<$K extends jni$_.JObject?, $V extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/generics/MyMap');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyMap<$K, $V>?>
-      nullableType<$K extends jni$_.JObject?, $V extends jni$_.JObject?>(
-    jni$_.JType<$K> K,
-    jni$_.JType<$V> V,
-  ) {
-    return $MyMap$NullableType$<$K, $V>(
-      K,
-      V,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyMap<$K, $V>>
-      type<$K extends jni$_.JObject?, $V extends jni$_.JObject?>(
-    jni$_.JType<$K> K,
-    jni$_.JType<$V> V,
-  ) {
-    return $MyMap$Type$<$K, $V>(
-      K,
-      V,
-    );
-  }
-
+  static const jni$_.JType<MyMap> type = $MyMap$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -5105,15 +3201,9 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory MyMap({
-    required jni$_.JType<$K> K,
-    required jni$_.JType<$V> V,
-  }) {
-    return MyMap<$K, $V>.fromReference(
-        K,
-        V,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory MyMap() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<MyMap<$K, $V>>();
   }
 
   static final _id_get = _class.instanceMethodId(
@@ -5140,7 +3230,7 @@
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _get(
             reference.pointer, _id_get as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_put = _class.instanceMethodId(
@@ -5175,7 +3265,7 @@
     final _$object1 = object1?.reference ?? jni$_.jNullReference;
     return _put(reference.pointer, _id_put as jni$_.JMethodIDPtr,
             _$object.pointer, _$object1.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_entryStack = _class.instanceMethodId(
@@ -5199,152 +3289,27 @@
   /// The returned object must be released after use, by calling the [release] method.
   MyStack<MyMap$MyEntry<$K?, $V?>?>? entryStack() {
     return _entryStack(reference.pointer, _id_entryStack as jni$_.JMethodIDPtr)
-        .object<MyStack<MyMap$MyEntry<$K?, $V?>?>?>(
-            $MyStack$NullableType$<MyMap$MyEntry<$K?, $V?>?>(
-                $MyMap$MyEntry$NullableType$<$K?, $V?>(
-                    K.nullableType, V.nullableType)));
+        .object<MyStack<MyMap$MyEntry<$K?, $V?>?>?>();
   }
 }
 
-final class $MyMap$NullableType$<$K extends jni$_.JObject?,
-    $V extends jni$_.JObject?> extends jni$_.JType<MyMap<$K, $V>?> {
+final class $MyMap$Type$ extends jni$_.JType<MyMap> {
   @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $MyMap$NullableType$(
-    this.K,
-    this.V,
-  );
+  const $MyMap$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/generics/MyMap;';
-
-  @jni$_.internal
-  @core$_.override
-  MyMap<$K, $V>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : MyMap<$K, $V>.fromReference(
-          K,
-          V,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyMap<$K, $V>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyMap$NullableType$, K, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyMap$NullableType$<$K, $V>) &&
-        other is $MyMap$NullableType$<$K, $V> &&
-        K == other.K &&
-        V == other.V;
-  }
-}
-
-final class $MyMap$Type$<$K extends jni$_.JObject?, $V extends jni$_.JObject?>
-    extends jni$_.JType<MyMap<$K, $V>> {
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $MyMap$Type$(
-    this.K,
-    this.V,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/generics/MyMap;';
-
-  @jni$_.internal
-  @core$_.override
-  MyMap<$K, $V> fromReference(jni$_.JReference reference) =>
-      MyMap<$K, $V>.fromReference(
-        K,
-        V,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyMap<$K, $V>?> get nullableType =>
-      $MyMap$NullableType$<$K, $V>(K, V);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyMap$Type$, K, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyMap$Type$<$K, $V>) &&
-        other is $MyMap$Type$<$K, $V> &&
-        K == other.K &&
-        V == other.V;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.MyStack`
-class MyStack<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyStack<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  MyStack.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type MyStack<$T extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/generics/MyStack');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyStack<$T>?> nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $MyStack$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyStack<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $MyStack$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<MyStack> type = $MyStack$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -5363,13 +3328,9 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory MyStack({
-    required jni$_.JType<$T> T,
-  }) {
-    return MyStack<$T>.fromReference(
-        T,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory MyStack() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<MyStack<$T>>();
   }
 
   static final _id_fromArray = _class.staticMethodId(
@@ -5391,13 +3352,12 @@
   /// from: `static public com.github.dart_lang.jnigen.generics.MyStack<T> fromArray(T[] objects)`
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$T?>? fromArray<$T extends jni$_.JObject?>(
-    jni$_.JArray<$T?>? objects, {
-    required jni$_.JType<$T> T,
-  }) {
+    jni$_.JArray<$T?>? objects,
+  ) {
     final _$objects = objects?.reference ?? jni$_.jNullReference;
     return _fromArray(_class.reference.pointer,
             _id_fromArray as jni$_.JMethodIDPtr, _$objects.pointer)
-        .object<MyStack<$T?>?>($MyStack$NullableType$<$T?>(T.nullableType));
+        .object<MyStack<$T?>?>();
   }
 
   static final _id_fromArrayOfArrayOfGrandParents = _class.staticMethodId(
@@ -5421,15 +3381,14 @@
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$S?>?
       fromArrayOfArrayOfGrandParents<$S extends jni$_.JObject?>(
-    jni$_.JArray<jni$_.JArray<GrandParent<$S?>?>?>? grandParents, {
-    required jni$_.JType<$S> S,
-  }) {
+    jni$_.JArray<jni$_.JArray<GrandParent<$S?>?>?>? grandParents,
+  ) {
     final _$grandParents = grandParents?.reference ?? jni$_.jNullReference;
     return _fromArrayOfArrayOfGrandParents(
             _class.reference.pointer,
             _id_fromArrayOfArrayOfGrandParents as jni$_.JMethodIDPtr,
             _$grandParents.pointer)
-        .object<MyStack<$S?>?>($MyStack$NullableType$<$S?>(S.nullableType));
+        .object<MyStack<$S?>?>();
   }
 
   static final _id_of = _class.staticMethodId(
@@ -5451,11 +3410,9 @@
 
   /// from: `static public com.github.dart_lang.jnigen.generics.MyStack<T> of()`
   /// The returned object must be released after use, by calling the [release] method.
-  static MyStack<$T?>? of<$T extends jni$_.JObject?>({
-    required jni$_.JType<$T> T,
-  }) {
+  static MyStack<$T?>? of<$T extends jni$_.JObject?>() {
     return _of(_class.reference.pointer, _id_of as jni$_.JMethodIDPtr)
-        .object<MyStack<$T?>?>($MyStack$NullableType$<$T?>(T.nullableType));
+        .object<MyStack<$T?>?>();
   }
 
   static final _id_of$1 = _class.staticMethodId(
@@ -5477,13 +3434,12 @@
   /// from: `static public com.github.dart_lang.jnigen.generics.MyStack<T> of(T object)`
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$T?>? of$1<$T extends jni$_.JObject?>(
-    $T? object, {
-    required jni$_.JType<$T> T,
-  }) {
+    $T? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _of$1(_class.reference.pointer, _id_of$1 as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<MyStack<$T?>?>($MyStack$NullableType$<$T?>(T.nullableType));
+        .object<MyStack<$T?>?>();
   }
 
   static final _id_of$2 = _class.staticMethodId(
@@ -5512,14 +3468,13 @@
   /// The returned object must be released after use, by calling the [release] method.
   static MyStack<$T?>? of$2<$T extends jni$_.JObject?>(
     $T? object,
-    $T? object1, {
-    required jni$_.JType<$T> T,
-  }) {
+    $T? object1,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     final _$object1 = object1?.reference ?? jni$_.jNullReference;
     return _of$2(_class.reference.pointer, _id_of$2 as jni$_.JMethodIDPtr,
             _$object.pointer, _$object1.pointer)
-        .object<MyStack<$T?>?>($MyStack$NullableType$<$T?>(T.nullableType));
+        .object<MyStack<$T?>?>();
   }
 
   static final _id_push = _class.instanceMethodId(
@@ -5567,8 +3522,7 @@
   /// from: `public T pop()`
   /// The returned object must be released after use, by calling the [release] method.
   $T? pop() {
-    return _pop(reference.pointer, _id_pop as jni$_.JMethodIDPtr)
-        .object<$T?>(T.nullableType);
+    return _pop(reference.pointer, _id_pop as jni$_.JMethodIDPtr).object<$T?>();
   }
 
   static final _id_size = _class.instanceMethodId(
@@ -5594,135 +3548,23 @@
   }
 }
 
-final class $MyStack$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<MyStack<$T>?> {
+final class $MyStack$Type$ extends jni$_.JType<MyStack> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $MyStack$NullableType$(
-    this.T,
-  );
+  const $MyStack$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/generics/MyStack;';
-
-  @jni$_.internal
-  @core$_.override
-  MyStack<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : MyStack<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyStack<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyStack$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyStack$NullableType$<$T>) &&
-        other is $MyStack$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $MyStack$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<MyStack<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $MyStack$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/generics/MyStack;';
-
-  @jni$_.internal
-  @core$_.override
-  MyStack<$T> fromReference(jni$_.JReference reference) =>
-      MyStack<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyStack<$T>?> get nullableType => $MyStack$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyStack$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyStack$Type$<$T>) &&
-        other is $MyStack$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.StringKeyedMap`
-class StringKeyedMap<$V extends jni$_.JObject?>
-    extends MyMap<jni$_.JString?, $V?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringKeyedMap<$V>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  StringKeyedMap.fromReference(
-    this.V,
-    jni$_.JReference reference,
-  )   : $type = type<$V>(V),
-        super.fromReference(
-            const jni$_.$JString$NullableType$(), V.nullableType, reference);
-
+extension type StringKeyedMap<$V extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements MyMap<jni$_.JString?, $V?> {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/StringKeyedMap');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<StringKeyedMap<$V>?>
-      nullableType<$V extends jni$_.JObject?>(
-    jni$_.JType<$V> V,
-  ) {
-    return $StringKeyedMap$NullableType$<$V>(
-      V,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<StringKeyedMap<$V>> type<$V extends jni$_.JObject?>(
-    jni$_.JType<$V> V,
-  ) {
-    return $StringKeyedMap$Type$<$V>(
-      V,
-    );
-  }
-
+  static const jni$_.JType<StringKeyedMap> type = $StringKeyedMap$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -5741,131 +3583,29 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory StringKeyedMap({
-    required jni$_.JType<$V> V,
-  }) {
-    return StringKeyedMap<$V>.fromReference(
-        V,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory StringKeyedMap() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<StringKeyedMap<$V>>();
   }
 }
 
-final class $StringKeyedMap$NullableType$<$V extends jni$_.JObject?>
-    extends jni$_.JType<StringKeyedMap<$V>?> {
+final class $StringKeyedMap$Type$ extends jni$_.JType<StringKeyedMap> {
   @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $StringKeyedMap$NullableType$(
-    this.V,
-  );
+  const $StringKeyedMap$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/StringKeyedMap;';
-
-  @jni$_.internal
-  @core$_.override
-  StringKeyedMap<$V>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : StringKeyedMap<$V>.fromReference(
-              V,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => $MyMap$NullableType$<jni$_.JString?, $V?>(
-      const jni$_.$JString$NullableType$(), V.nullableType);
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringKeyedMap<$V>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => Object.hash($StringKeyedMap$NullableType$, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringKeyedMap$NullableType$<$V>) &&
-        other is $StringKeyedMap$NullableType$<$V> &&
-        V == other.V;
-  }
-}
-
-final class $StringKeyedMap$Type$<$V extends jni$_.JObject?>
-    extends jni$_.JType<StringKeyedMap<$V>> {
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $StringKeyedMap$Type$(
-    this.V,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/StringKeyedMap;';
-
-  @jni$_.internal
-  @core$_.override
-  StringKeyedMap<$V> fromReference(jni$_.JReference reference) =>
-      StringKeyedMap<$V>.fromReference(
-        V,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => $MyMap$NullableType$<jni$_.JString?, $V?>(
-      const jni$_.$JString$NullableType$(), V.nullableType);
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringKeyedMap<$V>?> get nullableType =>
-      $StringKeyedMap$NullableType$<$V>(V);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => Object.hash($StringKeyedMap$Type$, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringKeyedMap$Type$<$V>) &&
-        other is $StringKeyedMap$Type$<$V> &&
-        V == other.V;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.StringMap`
-class StringMap extends StringKeyedMap<jni$_.JString?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringMap> $type;
-
-  @jni$_.internal
-  StringMap.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(const jni$_.$JString$NullableType$(), reference);
-
+extension type StringMap._(jni$_.JObject _$this)
+    implements StringKeyedMap<jni$_.JString?> {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/generics/StringMap');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<StringMap?> nullableType =
-      $StringMap$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<StringMap> type = $StringMap$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -5886,48 +3626,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory StringMap() {
-    return StringMap.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $StringMap$NullableType$ extends jni$_.JType<StringMap?> {
-  @jni$_.internal
-  const $StringMap$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/generics/StringMap;';
-
-  @jni$_.internal
-  @core$_.override
-  StringMap? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : StringMap.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType =>
-      const $StringKeyedMap$NullableType$<jni$_.JString?>(
-          jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringMap?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 3;
-
-  @core$_.override
-  int get hashCode => ($StringMap$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringMap$NullableType$) &&
-        other is $StringMap$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<StringMap>();
   }
 }
 
@@ -5938,56 +3638,15 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/generics/StringMap;';
-
-  @jni$_.internal
-  @core$_.override
-  StringMap fromReference(jni$_.JReference reference) =>
-      StringMap.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType =>
-      const $StringKeyedMap$NullableType$<jni$_.JString?>(
-          jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringMap?> get nullableType => const $StringMap$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 3;
-
-  @core$_.override
-  int get hashCode => ($StringMap$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringMap$Type$) && other is $StringMap$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.StringStack`
-class StringStack extends MyStack<jni$_.JString?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringStack> $type;
-
-  @jni$_.internal
-  StringStack.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(const jni$_.$JString$NullableType$(), reference);
-
+extension type StringStack._(jni$_.JObject _$this)
+    implements MyStack<jni$_.JString?> {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/generics/StringStack');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<StringStack?> nullableType =
-      $StringStack$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<StringStack> type = $StringStack$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -6008,47 +3667,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory StringStack() {
-    return StringStack.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $StringStack$NullableType$ extends jni$_.JType<StringStack?> {
-  @jni$_.internal
-  const $StringStack$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/generics/StringStack;';
-
-  @jni$_.internal
-  @core$_.override
-  StringStack? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : StringStack.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const $MyStack$NullableType$<jni$_.JString?>(
-      jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringStack?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => ($StringStack$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringStack$NullableType$) &&
-        other is $StringStack$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<StringStack>();
   }
 }
 
@@ -6059,77 +3679,16 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/generics/StringStack;';
-
-  @jni$_.internal
-  @core$_.override
-  StringStack fromReference(jni$_.JReference reference) =>
-      StringStack.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const $MyStack$NullableType$<jni$_.JString?>(
-      jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringStack?> get nullableType =>
-      const $StringStack$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => ($StringStack$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringStack$Type$) &&
-        other is $StringStack$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.generics.StringValuedMap`
-class StringValuedMap<$K extends jni$_.JObject?>
-    extends MyMap<$K?, jni$_.JString?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringValuedMap<$K>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  StringValuedMap.fromReference(
-    this.K,
-    jni$_.JReference reference,
-  )   : $type = type<$K>(K),
-        super.fromReference(
-            K.nullableType, const jni$_.$JString$NullableType$(), reference);
-
+extension type StringValuedMap<$K extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements MyMap<$K?, jni$_.JString?> {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/generics/StringValuedMap');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<StringValuedMap<$K>?>
-      nullableType<$K extends jni$_.JObject?>(
-    jni$_.JType<$K> K,
-  ) {
-    return $StringValuedMap$NullableType$<$K>(
-      K,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<StringValuedMap<$K>> type<$K extends jni$_.JObject?>(
-    jni$_.JType<$K> K,
-  ) {
-    return $StringValuedMap$Type$<$K>(
-      K,
-    );
-  }
-
+  static const jni$_.JType<StringValuedMap> type = $StringValuedMap$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -6148,149 +3707,30 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory StringValuedMap({
-    required jni$_.JType<$K> K,
-  }) {
-    return StringValuedMap<$K>.fromReference(
-        K,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory StringValuedMap() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<StringValuedMap<$K>>();
   }
 }
 
-final class $StringValuedMap$NullableType$<$K extends jni$_.JObject?>
-    extends jni$_.JType<StringValuedMap<$K>?> {
+final class $StringValuedMap$Type$ extends jni$_.JType<StringValuedMap> {
   @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  const $StringValuedMap$NullableType$(
-    this.K,
-  );
+  const $StringValuedMap$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/generics/StringValuedMap;';
-
-  @jni$_.internal
-  @core$_.override
-  StringValuedMap<$K>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : StringValuedMap<$K>.fromReference(
-              K,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => $MyMap$NullableType$<$K?, jni$_.JString?>(
-      K.nullableType, const jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringValuedMap<$K>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => Object.hash($StringValuedMap$NullableType$, K);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringValuedMap$NullableType$<$K>) &&
-        other is $StringValuedMap$NullableType$<$K> &&
-        K == other.K;
-  }
-}
-
-final class $StringValuedMap$Type$<$K extends jni$_.JObject?>
-    extends jni$_.JType<StringValuedMap<$K>> {
-  @jni$_.internal
-  final jni$_.JType<$K> K;
-
-  @jni$_.internal
-  const $StringValuedMap$Type$(
-    this.K,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/generics/StringValuedMap;';
-
-  @jni$_.internal
-  @core$_.override
-  StringValuedMap<$K> fromReference(jni$_.JReference reference) =>
-      StringValuedMap<$K>.fromReference(
-        K,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => $MyMap$NullableType$<$K?, jni$_.JString?>(
-      K.nullableType, const jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringValuedMap<$K>?> get nullableType =>
-      $StringValuedMap$NullableType$<$K>(K);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => Object.hash($StringValuedMap$Type$, K);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringValuedMap$Type$<$K>) &&
-        other is $StringValuedMap$Type$<$K> &&
-        K == other.K;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.GenericInterface`
-class GenericInterface<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GenericInterface<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  GenericInterface.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type GenericInterface<$T extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/GenericInterface');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GenericInterface<$T>?>
-      nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $GenericInterface$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GenericInterface<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $GenericInterface$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<GenericInterface> type = $GenericInterface$Type$();
   static final _id_genericArrayOf = _class.instanceMethodId(
     r'genericArrayOf',
     r'(Ljava/lang/Object;)[Ljava/lang/Object;',
@@ -6310,14 +3750,12 @@
   /// from: `public abstract U[] genericArrayOf(U object)`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JArray<$U?>? genericArrayOf<$U extends jni$_.JObject?>(
-    $U? object, {
-    required jni$_.JType<$U> U,
-  }) {
+    $U? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _genericArrayOf(reference.pointer,
             _id_genericArrayOf as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<jni$_.JArray<$U?>?>(
-            jni$_.$JArray$NullableType$<$U?>(U.nullableType));
+        .object<jni$_.JArray<$U?>?>();
   }
 
   static final _id_arrayOf = _class.instanceMethodId(
@@ -6344,8 +3782,7 @@
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _arrayOf(reference.pointer, _id_arrayOf as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<jni$_.JArray<$T?>?>(
-            jni$_.$JArray$NullableType$<$T?>(T.nullableType));
+        .object<jni$_.JArray<$T?>?>();
   }
 
   static final _id_mapOf = _class.instanceMethodId(
@@ -6374,15 +3811,13 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JMap<$T?, $U?>? mapOf<$U extends jni$_.JObject?>(
     $T? object,
-    $U? object1, {
-    required jni$_.JType<$U> U,
-  }) {
+    $U? object1,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     final _$object1 = object1?.reference ?? jni$_.jNullReference;
     return _mapOf(reference.pointer, _id_mapOf as jni$_.JMethodIDPtr,
             _$object.pointer, _$object1.pointer)
-        .object<jni$_.JMap<$T?, $U?>?>(jni$_.$JMap$NullableType$<$T?, $U?>(
-            T.nullableType, U.nullableType));
+        .object<jni$_.JMap<$T?, $U?>?>();
   }
 
   static final _id_firstOfGenericArray = _class.instanceMethodId(
@@ -6404,13 +3839,12 @@
   /// from: `public abstract U firstOfGenericArray(U[] objects)`
   /// The returned object must be released after use, by calling the [release] method.
   $U? firstOfGenericArray<$U extends jni$_.JObject?>(
-    jni$_.JArray<$U?>? objects, {
-    required jni$_.JType<$U> U,
-  }) {
+    jni$_.JArray<$U?>? objects,
+  ) {
     final _$objects = objects?.reference ?? jni$_.jNullReference;
     return _firstOfGenericArray(reference.pointer,
             _id_firstOfGenericArray as jni$_.JMethodIDPtr, _$objects.pointer)
-        .object<$U?>(U.nullableType);
+        .object<$U?>();
   }
 
   static final _id_firstOfArray = _class.instanceMethodId(
@@ -6437,7 +3871,7 @@
     final _$objects = objects?.reference ?? jni$_.jNullReference;
     return _firstOfArray(reference.pointer,
             _id_firstOfArray as jni$_.JMethodIDPtr, _$objects.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstKeyOf = _class.instanceMethodId(
@@ -6459,13 +3893,12 @@
   /// from: `public abstract T firstKeyOf(java.util.Map<T, U> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $T? firstKeyOf<$U extends jni$_.JObject?>(
-    jni$_.JMap<$T?, $U?>? map, {
-    required jni$_.JType<$U> U,
-  }) {
+    jni$_.JMap<$T?, $U?>? map,
+  ) {
     final _$map = map?.reference ?? jni$_.jNullReference;
     return _firstKeyOf(reference.pointer, _id_firstKeyOf as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstValueOf = _class.instanceMethodId(
@@ -6487,13 +3920,12 @@
   /// from: `public abstract U firstValueOf(java.util.Map<T, U> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $U? firstValueOf<$U extends jni$_.JObject?>(
-    jni$_.JMap<$T?, $U?>? map, {
-    required jni$_.JType<$U> U,
-  }) {
+    jni$_.JMap<$T?, $U?>? map,
+  ) {
     final _$map = map?.reference ?? jni$_.jNullReference;
     return _firstValueOf(reference.pointer,
             _id_firstValueOf as jni$_.JMethodIDPtr, _$map.pointer)
-        .object<$U?>(U.nullableType);
+        .object<$U?>();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -6528,7 +3960,7 @@
       final $a = $i.args;
       if ($d == r'genericArrayOf(Ljava/lang/Object;)[Ljava/lang/Object;') {
         final $r = _$impls[$p]!.genericArrayOf(
-          $a![0]?.as(const jni$_.$JObject$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6538,7 +3970,7 @@
       }
       if ($d == r'arrayOf(Ljava/lang/Object;)[Ljava/lang/Object;') {
         final $r = _$impls[$p]!.arrayOf(
-          $a![0]?.as(_$impls[$p]!.T, releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6548,8 +3980,8 @@
       }
       if ($d == r'mapOf(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;') {
         final $r = _$impls[$p]!.mapOf(
-          $a![0]?.as(_$impls[$p]!.T, releaseOriginal: true),
-          $a![1]?.as(const jni$_.$JObject$Type$(), releaseOriginal: true),
+          $a![0],
+          $a![1],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6559,10 +3991,7 @@
       }
       if ($d == r'firstOfGenericArray([Ljava/lang/Object;)Ljava/lang/Object;') {
         final $r = _$impls[$p]!.firstOfGenericArray(
-          $a![0]?.as(
-              const jni$_.$JArray$Type$<jni$_.JObject?>(
-                  jni$_.$JObject$NullableType$()),
-              releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6572,10 +4001,7 @@
       }
       if ($d == r'firstOfArray([Ljava/lang/Object;)Ljava/lang/Object;') {
         final $r = _$impls[$p]!.firstOfArray(
-          $a![0]?.as(
-              const jni$_.$JArray$Type$<jni$_.JObject?>(
-                  jni$_.$JObject$NullableType$()),
-              releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6585,11 +4011,7 @@
       }
       if ($d == r'firstKeyOf(Ljava/util/Map;)Ljava/lang/Object;') {
         final $r = _$impls[$p]!.firstKeyOf(
-          $a![0]?.as(
-              const jni$_.$JMap$Type$<jni$_.JObject?, jni$_.JObject?>(
-                  jni$_.$JObject$NullableType$(),
-                  jni$_.$JObject$NullableType$()),
-              releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6599,11 +4021,7 @@
       }
       if ($d == r'firstValueOf(Ljava/util/Map;)Ljava/lang/Object;') {
         final $r = _$impls[$p]!.firstValueOf(
-          $a![0]?.as(
-              const jni$_.$JMap$Type$<jni$_.JObject?, jni$_.JObject?>(
-                  jni$_.$JObject$NullableType$(),
-                  jni$_.$JObject$NullableType$()),
-              releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -6647,16 +4065,12 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return GenericInterface<$T>.fromReference(
-      $impl.T,
-      $i.implementReference(),
-    );
+    return $i.implement<GenericInterface<$T>>();
   }
 }
 
 abstract base mixin class $GenericInterface<$T extends jni$_.JObject?> {
   factory $GenericInterface({
-    required jni$_.JType<$T> T,
     required jni$_.JArray<jni$_.JObject?>? Function(jni$_.JObject? object)
         genericArrayOf,
     required jni$_.JArray<jni$_.JObject?>? Function($T? object) arrayOf,
@@ -6673,8 +4087,6 @@
         firstValueOf,
   }) = _$GenericInterface<$T>;
 
-  jni$_.JType<$T> get T;
-
   jni$_.JArray<jni$_.JObject?>? genericArrayOf(jni$_.JObject? object);
   jni$_.JArray<jni$_.JObject?>? arrayOf($T? object);
   jni$_.JMap<jni$_.JObject?, jni$_.JObject?>? mapOf(
@@ -6688,7 +4100,6 @@
 final class _$GenericInterface<$T extends jni$_.JObject?>
     with $GenericInterface<$T> {
   _$GenericInterface({
-    required this.T,
     required jni$_.JArray<jni$_.JObject?>? Function(jni$_.JObject? object)
         genericArrayOf,
     required jni$_.JArray<jni$_.JObject?>? Function($T? object) arrayOf,
@@ -6711,9 +4122,6 @@
         _firstKeyOf = firstKeyOf,
         _firstValueOf = firstValueOf;
 
-  @core$_.override
-  final jni$_.JType<$T> T;
-
   final jni$_.JArray<jni$_.JObject?>? Function(jni$_.JObject? object)
       _genericArrayOf;
   final jni$_.JArray<jni$_.JObject?>? Function($T? object) _arrayOf;
@@ -6757,119 +4165,23 @@
   }
 }
 
-final class $GenericInterface$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<GenericInterface<$T>?> {
+final class $GenericInterface$Type$ extends jni$_.JType<GenericInterface> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $GenericInterface$NullableType$(
-    this.T,
-  );
+  const $GenericInterface$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/GenericInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  GenericInterface<$T>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GenericInterface<$T>.fromReference(
-              T,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GenericInterface<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GenericInterface$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GenericInterface$NullableType$<$T>) &&
-        other is $GenericInterface$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $GenericInterface$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<GenericInterface<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $GenericInterface$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/GenericInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  GenericInterface<$T> fromReference(jni$_.JReference reference) =>
-      GenericInterface<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GenericInterface<$T>?> get nullableType =>
-      $GenericInterface$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($GenericInterface$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GenericInterface$Type$<$T>) &&
-        other is $GenericInterface$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.InheritedFromMyInterface`
-class InheritedFromMyInterface extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<InheritedFromMyInterface> $type;
-
-  @jni$_.internal
-  InheritedFromMyInterface.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type InheritedFromMyInterface._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/InheritedFromMyInterface');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<InheritedFromMyInterface?> nullableType =
-      $InheritedFromMyInterface$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<InheritedFromMyInterface> type =
       $InheritedFromMyInterface$Type$();
   static final _id_voidCallback = _class.instanceMethodId(
@@ -6922,7 +4234,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _stringCallback(reference.pointer,
             _id_stringCallback as jni$_.JMethodIDPtr, _$string.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_varCallback = _class.instanceMethodId(
@@ -6949,7 +4261,7 @@
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _varCallback(reference.pointer,
             _id_varCallback as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_manyPrimitives = _class.instanceMethodId(
@@ -7017,13 +4329,13 @@
       final $a = $i.args;
       if ($d == r'voidCallback(Ljava/lang/String;)V') {
         _$impls[$p]!.voidCallback(
-          $a![0]?.as(const jni$_.$JString$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return jni$_.nullptr;
       }
       if ($d == r'stringCallback(Ljava/lang/String;)Ljava/lang/String;') {
         final $r = _$impls[$p]!.stringCallback(
-          $a![0]?.as(const jni$_.$JString$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -7033,7 +4345,7 @@
       }
       if ($d == r'varCallback(Ljava/lang/String;)Ljava/lang/String;') {
         final $r = _$impls[$p]!.varCallback(
-          $a![0]?.as(const jni$_.$JString$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -7043,18 +4355,10 @@
       }
       if ($d == r'manyPrimitives(IZCD)J') {
         final $r = _$impls[$p]!.manyPrimitives(
-          $a![0]!
-              .as(const jni$_.$JInteger$Type$(), releaseOriginal: true)
-              .intValue(releaseOriginal: true),
-          $a![1]!
-              .as(const jni$_.$JBoolean$Type$(), releaseOriginal: true)
-              .booleanValue(releaseOriginal: true),
-          $a![2]!
-              .as(const jni$_.$JCharacter$Type$(), releaseOriginal: true)
-              .charValue(releaseOriginal: true),
-          $a![3]!
-              .as(const jni$_.$JDouble$Type$(), releaseOriginal: true)
-              .doubleValue(releaseOriginal: true),
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+          ($a![1] as jni$_.JBoolean).booleanValue(releaseOriginal: true),
+          ($a![2] as jni$_.JCharacter).charValue(releaseOriginal: true),
+          ($a![3] as jni$_.JDouble).doubleValue(releaseOriginal: true),
         );
         return jni$_.JLong($r).reference.toPointer();
       }
@@ -7096,9 +4400,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return InheritedFromMyInterface.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<InheritedFromMyInterface>();
   }
 }
 
@@ -7153,46 +4455,6 @@
   }
 }
 
-final class $InheritedFromMyInterface$NullableType$
-    extends jni$_.JType<InheritedFromMyInterface?> {
-  @jni$_.internal
-  const $InheritedFromMyInterface$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/InheritedFromMyInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  InheritedFromMyInterface? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : InheritedFromMyInterface.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<InheritedFromMyInterface?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($InheritedFromMyInterface$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($InheritedFromMyInterface$NullableType$) &&
-        other is $InheritedFromMyInterface$NullableType$;
-  }
-}
-
 final class $InheritedFromMyInterface$Type$
     extends jni$_.JType<InheritedFromMyInterface> {
   @jni$_.internal
@@ -7202,56 +4464,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/InheritedFromMyInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  InheritedFromMyInterface fromReference(jni$_.JReference reference) =>
-      InheritedFromMyInterface.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<InheritedFromMyInterface?> get nullableType =>
-      const $InheritedFromMyInterface$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($InheritedFromMyInterface$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($InheritedFromMyInterface$Type$) &&
-        other is $InheritedFromMyInterface$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.InheritedFromMyRunnable`
-class InheritedFromMyRunnable extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<InheritedFromMyRunnable> $type;
-
-  @jni$_.internal
-  InheritedFromMyRunnable.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type InheritedFromMyRunnable._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/InheritedFromMyRunnable');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<InheritedFromMyRunnable?> nullableType =
-      $InheritedFromMyRunnable$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<InheritedFromMyRunnable> type =
       $InheritedFromMyRunnable$Type$();
   static final _id_run = _class.instanceMethodId(
@@ -7348,9 +4569,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return InheritedFromMyRunnable.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<InheritedFromMyRunnable>();
   }
 }
 
@@ -7378,46 +4597,6 @@
   }
 }
 
-final class $InheritedFromMyRunnable$NullableType$
-    extends jni$_.JType<InheritedFromMyRunnable?> {
-  @jni$_.internal
-  const $InheritedFromMyRunnable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/InheritedFromMyRunnable;';
-
-  @jni$_.internal
-  @core$_.override
-  InheritedFromMyRunnable? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : InheritedFromMyRunnable.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<InheritedFromMyRunnable?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($InheritedFromMyRunnable$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($InheritedFromMyRunnable$NullableType$) &&
-        other is $InheritedFromMyRunnable$NullableType$;
-  }
-}
-
 final class $InheritedFromMyRunnable$Type$
     extends jni$_.JType<InheritedFromMyRunnable> {
   @jni$_.internal
@@ -7427,73 +4606,16 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/InheritedFromMyRunnable;';
-
-  @jni$_.internal
-  @core$_.override
-  InheritedFromMyRunnable fromReference(jni$_.JReference reference) =>
-      InheritedFromMyRunnable.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<InheritedFromMyRunnable?> get nullableType =>
-      const $InheritedFromMyRunnable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($InheritedFromMyRunnable$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($InheritedFromMyRunnable$Type$) &&
-        other is $InheritedFromMyRunnable$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.MyInterface`
-class MyInterface<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyInterface<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  MyInterface.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type MyInterface<$T extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/MyInterface');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyInterface<$T>?> nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $MyInterface$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<MyInterface<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $MyInterface$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<MyInterface> type = $MyInterface$Type$();
   static final _id_voidCallback = _class.instanceMethodId(
     r'voidCallback',
     r'(Ljava/lang/String;)V',
@@ -7544,7 +4666,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _stringCallback(reference.pointer,
             _id_stringCallback as jni$_.JMethodIDPtr, _$string.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_varCallback = _class.instanceMethodId(
@@ -7571,7 +4693,7 @@
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _varCallback(reference.pointer,
             _id_varCallback as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_manyPrimitives = _class.instanceMethodId(
@@ -7639,13 +4761,13 @@
       final $a = $i.args;
       if ($d == r'voidCallback(Ljava/lang/String;)V') {
         _$impls[$p]!.voidCallback(
-          $a![0]?.as(const jni$_.$JString$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return jni$_.nullptr;
       }
       if ($d == r'stringCallback(Ljava/lang/String;)Ljava/lang/String;') {
         final $r = _$impls[$p]!.stringCallback(
-          $a![0]?.as(const jni$_.$JString$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -7655,7 +4777,7 @@
       }
       if ($d == r'varCallback(Ljava/lang/Object;)Ljava/lang/Object;') {
         final $r = _$impls[$p]!.varCallback(
-          $a![0]?.as(_$impls[$p]!.T, releaseOriginal: true),
+          $a![0],
         );
         return ($r as jni$_.JObject?)
                 ?.as(const jni$_.$JObject$Type$())
@@ -7665,18 +4787,10 @@
       }
       if ($d == r'manyPrimitives(IZCD)J') {
         final $r = _$impls[$p]!.manyPrimitives(
-          $a![0]!
-              .as(const jni$_.$JInteger$Type$(), releaseOriginal: true)
-              .intValue(releaseOriginal: true),
-          $a![1]!
-              .as(const jni$_.$JBoolean$Type$(), releaseOriginal: true)
-              .booleanValue(releaseOriginal: true),
-          $a![2]!
-              .as(const jni$_.$JCharacter$Type$(), releaseOriginal: true)
-              .charValue(releaseOriginal: true),
-          $a![3]!
-              .as(const jni$_.$JDouble$Type$(), releaseOriginal: true)
-              .doubleValue(releaseOriginal: true),
+          ($a![0] as jni$_.JInteger).intValue(releaseOriginal: true),
+          ($a![1] as jni$_.JBoolean).booleanValue(releaseOriginal: true),
+          ($a![2] as jni$_.JCharacter).charValue(releaseOriginal: true),
+          ($a![3] as jni$_.JDouble).doubleValue(releaseOriginal: true),
         );
         return jni$_.JLong($r).reference.toPointer();
       }
@@ -7718,17 +4832,13 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return MyInterface<$T>.fromReference(
-      $impl.T,
-      $i.implementReference(),
-    );
+    return $i.implement<MyInterface<$T>>();
   }
   static core$_.Map<int, $MyInterface> get $impls => _$impls;
 }
 
 abstract base mixin class $MyInterface<$T extends jni$_.JObject?> {
   factory $MyInterface({
-    required jni$_.JType<$T> T,
     required void Function(jni$_.JString? string) voidCallback,
     bool voidCallback$async,
     required jni$_.JString? Function(jni$_.JString? string) stringCallback,
@@ -7736,8 +4846,6 @@
     required int Function(int i, bool z, int c, double d) manyPrimitives,
   }) = _$MyInterface<$T>;
 
-  jni$_.JType<$T> get T;
-
   void voidCallback(jni$_.JString? string);
   bool get voidCallback$async => false;
   jni$_.JString? stringCallback(jni$_.JString? string);
@@ -7747,7 +4855,6 @@
 
 final class _$MyInterface<$T extends jni$_.JObject?> with $MyInterface<$T> {
   _$MyInterface({
-    required this.T,
     required void Function(jni$_.JString? string) voidCallback,
     this.voidCallback$async = false,
     required jni$_.JString? Function(jni$_.JString? string) stringCallback,
@@ -7758,9 +4865,6 @@
         _varCallback = varCallback,
         _manyPrimitives = manyPrimitives;
 
-  @core$_.override
-  final jni$_.JType<$T> T;
-
   final void Function(jni$_.JString? string) _voidCallback;
   final bool voidCallback$async;
   final jni$_.JString? Function(jni$_.JString? string) _stringCallback;
@@ -7784,118 +4888,23 @@
   }
 }
 
-final class $MyInterface$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<MyInterface<$T>?> {
+final class $MyInterface$Type$ extends jni$_.JType<MyInterface> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $MyInterface$NullableType$(
-    this.T,
-  );
+  const $MyInterface$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/MyInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  MyInterface<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : MyInterface<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyInterface<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyInterface$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyInterface$NullableType$<$T>) &&
-        other is $MyInterface$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $MyInterface$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<MyInterface<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $MyInterface$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/MyInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  MyInterface<$T> fromReference(jni$_.JReference reference) =>
-      MyInterface<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyInterface<$T>?> get nullableType =>
-      $MyInterface$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($MyInterface$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyInterface$Type$<$T>) &&
-        other is $MyInterface$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.MyInterfaceConsumer`
-class MyInterfaceConsumer extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyInterfaceConsumer> $type;
-
-  @jni$_.internal
-  MyInterfaceConsumer.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type MyInterfaceConsumer._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/MyInterfaceConsumer');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<MyInterfaceConsumer?> nullableType =
-      $MyInterfaceConsumer$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<MyInterfaceConsumer> type =
       $MyInterfaceConsumer$Type$();
   static final _id_new$ = _class.constructorId(
@@ -7917,9 +4926,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory MyInterfaceConsumer() {
-    return MyInterfaceConsumer.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<MyInterfaceConsumer>();
   }
 
   static final _id_consumeOnAnotherThread = _class.staticMethodId(
@@ -7962,9 +4970,8 @@
     bool z,
     int c,
     double d,
-    $T? object, {
-    required jni$_.JType<$T> T,
-  }) {
+    $T? object,
+  ) {
     final _$myInterface = myInterface?.reference ?? jni$_.jNullReference;
     final _$string = string?.reference ?? jni$_.jNullReference;
     final _$object = object?.reference ?? jni$_.jNullReference;
@@ -8021,9 +5028,8 @@
     bool z,
     int c,
     double d,
-    $T? object, {
-    required jni$_.JType<$T> T,
-  }) {
+    $T? object,
+  ) {
     final _$myInterface = myInterface?.reference ?? jni$_.jNullReference;
     final _$string = string?.reference ?? jni$_.jNullReference;
     final _$object = object?.reference ?? jni$_.jNullReference;
@@ -8041,46 +5047,6 @@
   }
 }
 
-final class $MyInterfaceConsumer$NullableType$
-    extends jni$_.JType<MyInterfaceConsumer?> {
-  @jni$_.internal
-  const $MyInterfaceConsumer$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/MyInterfaceConsumer;';
-
-  @jni$_.internal
-  @core$_.override
-  MyInterfaceConsumer? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : MyInterfaceConsumer.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyInterfaceConsumer?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyInterfaceConsumer$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyInterfaceConsumer$NullableType$) &&
-        other is $MyInterfaceConsumer$NullableType$;
-  }
-}
-
 final class $MyInterfaceConsumer$Type$
     extends jni$_.JType<MyInterfaceConsumer> {
   @jni$_.internal
@@ -8090,56 +5056,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/MyInterfaceConsumer;';
-
-  @jni$_.internal
-  @core$_.override
-  MyInterfaceConsumer fromReference(jni$_.JReference reference) =>
-      MyInterfaceConsumer.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyInterfaceConsumer?> get nullableType =>
-      const $MyInterfaceConsumer$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyInterfaceConsumer$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyInterfaceConsumer$Type$) &&
-        other is $MyInterfaceConsumer$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.MyRunnable`
-class MyRunnable extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyRunnable> $type;
-
-  @jni$_.internal
-  MyRunnable.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type MyRunnable._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/MyRunnable');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<MyRunnable?> nullableType =
-      $MyRunnable$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<MyRunnable> type = $MyRunnable$Type$();
   static final _id_run = _class.instanceMethodId(
     r'run',
@@ -8235,9 +5159,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return MyRunnable.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<MyRunnable>();
   }
   static core$_.Map<int, $MyRunnable> get $impls => _$impls;
 }
@@ -8266,44 +5188,6 @@
   }
 }
 
-final class $MyRunnable$NullableType$ extends jni$_.JType<MyRunnable?> {
-  @jni$_.internal
-  const $MyRunnable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/MyRunnable;';
-
-  @jni$_.internal
-  @core$_.override
-  MyRunnable? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : MyRunnable.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyRunnable?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyRunnable$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyRunnable$NullableType$) &&
-        other is $MyRunnable$NullableType$;
-  }
-}
-
 final class $MyRunnable$Type$ extends jni$_.JType<MyRunnable> {
   @jni$_.internal
   const $MyRunnable$Type$();
@@ -8312,56 +5196,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/MyRunnable;';
-
-  @jni$_.internal
-  @core$_.override
-  MyRunnable fromReference(jni$_.JReference reference) =>
-      MyRunnable.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyRunnable?> get nullableType =>
-      const $MyRunnable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyRunnable$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyRunnable$Type$) &&
-        other is $MyRunnable$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.MyRunnableRunner`
-class MyRunnableRunner extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyRunnableRunner> $type;
-
-  @jni$_.internal
-  MyRunnableRunner.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type MyRunnableRunner._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/MyRunnableRunner');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<MyRunnableRunner?> nullableType =
-      $MyRunnableRunner$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<MyRunnableRunner> type = $MyRunnableRunner$Type$();
   static final _id_error = _class.instanceFieldId(
     r'error',
@@ -8399,9 +5242,9 @@
     MyRunnable? myRunnable,
   ) {
     final _$myRunnable = myRunnable?.reference ?? jni$_.jNullReference;
-    return MyRunnableRunner.fromReference(_new$(_class.reference.pointer,
-            _id_new$ as jni$_.JMethodIDPtr, _$myRunnable.pointer)
-        .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$myRunnable.pointer)
+        .object<MyRunnableRunner>();
   }
 
   static final _id_runOnSameThread = _class.instanceMethodId(
@@ -8477,46 +5320,6 @@
   }
 }
 
-final class $MyRunnableRunner$NullableType$
-    extends jni$_.JType<MyRunnableRunner?> {
-  @jni$_.internal
-  const $MyRunnableRunner$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/MyRunnableRunner;';
-
-  @jni$_.internal
-  @core$_.override
-  MyRunnableRunner? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : MyRunnableRunner.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyRunnableRunner?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyRunnableRunner$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyRunnableRunner$NullableType$) &&
-        other is $MyRunnableRunner$NullableType$;
-  }
-}
-
 final class $MyRunnableRunner$Type$ extends jni$_.JType<MyRunnableRunner> {
   @jni$_.internal
   const $MyRunnableRunner$Type$();
@@ -8525,56 +5328,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/MyRunnableRunner;';
-
-  @jni$_.internal
-  @core$_.override
-  MyRunnableRunner fromReference(jni$_.JReference reference) =>
-      MyRunnableRunner.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyRunnableRunner?> get nullableType =>
-      const $MyRunnableRunner$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyRunnableRunner$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyRunnableRunner$Type$) &&
-        other is $MyRunnableRunner$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.StringConversionException`
-class StringConversionException extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringConversionException> $type;
-
-  @jni$_.internal
-  StringConversionException.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type StringConversionException._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/StringConversionException');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<StringConversionException?> nullableType =
-      $StringConversionException$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<StringConversionException> type =
       $StringConversionException$Type$();
   static final _id_new$ = _class.constructorId(
@@ -8598,51 +5360,9 @@
     jni$_.JString? string,
   ) {
     final _$string = string?.reference ?? jni$_.jNullReference;
-    return StringConversionException.fromReference(_new$(
-            _class.reference.pointer,
-            _id_new$ as jni$_.JMethodIDPtr,
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
             _$string.pointer)
-        .reference);
-  }
-}
-
-final class $StringConversionException$NullableType$
-    extends jni$_.JType<StringConversionException?> {
-  @jni$_.internal
-  const $StringConversionException$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/StringConversionException;';
-
-  @jni$_.internal
-  @core$_.override
-  StringConversionException? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : StringConversionException.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringConversionException?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($StringConversionException$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringConversionException$NullableType$) &&
-        other is $StringConversionException$NullableType$;
+        .object<StringConversionException>();
   }
 }
 
@@ -8655,56 +5375,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/StringConversionException;';
-
-  @jni$_.internal
-  @core$_.override
-  StringConversionException fromReference(jni$_.JReference reference) =>
-      StringConversionException.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringConversionException?> get nullableType =>
-      const $StringConversionException$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($StringConversionException$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringConversionException$Type$) &&
-        other is $StringConversionException$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.StringConverter`
-class StringConverter extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringConverter> $type;
-
-  @jni$_.internal
-  StringConverter.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type StringConverter._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/StringConverter');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<StringConverter?> nullableType =
-      $StringConverter$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<StringConverter> type = $StringConverter$Type$();
   static final _id_parseToInt = _class.instanceMethodId(
     r'parseToInt',
@@ -8764,7 +5443,7 @@
       final $a = $i.args;
       if ($d == r'parseToInt(Ljava/lang/String;)I') {
         final $r = _$impls[$p]!.parseToInt(
-          $a![0]?.as(const jni$_.$JString$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return jni$_.JInteger($r).reference.toPointer();
       }
@@ -8804,9 +5483,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return StringConverter.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<StringConverter>();
   }
 }
 
@@ -8830,45 +5507,6 @@
   }
 }
 
-final class $StringConverter$NullableType$
-    extends jni$_.JType<StringConverter?> {
-  @jni$_.internal
-  const $StringConverter$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/StringConverter;';
-
-  @jni$_.internal
-  @core$_.override
-  StringConverter? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : StringConverter.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringConverter?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($StringConverter$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringConverter$NullableType$) &&
-        other is $StringConverter$NullableType$;
-  }
-}
-
 final class $StringConverter$Type$ extends jni$_.JType<StringConverter> {
   @jni$_.internal
   const $StringConverter$Type$();
@@ -8877,56 +5515,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/StringConverter;';
-
-  @jni$_.internal
-  @core$_.override
-  StringConverter fromReference(jni$_.JReference reference) =>
-      StringConverter.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringConverter?> get nullableType =>
-      const $StringConverter$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($StringConverter$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringConverter$Type$) &&
-        other is $StringConverter$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.interfaces.StringConverterConsumer`
-class StringConverterConsumer extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<StringConverterConsumer> $type;
-
-  @jni$_.internal
-  StringConverterConsumer.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type StringConverterConsumer._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/interfaces/StringConverterConsumer');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<StringConverterConsumer?> nullableType =
-      $StringConverterConsumer$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<StringConverterConsumer> type =
       $StringConverterConsumer$Type$();
   static final _id_new$ = _class.constructorId(
@@ -8948,9 +5545,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory StringConverterConsumer() {
-    return StringConverterConsumer.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<StringConverterConsumer>();
   }
 
   static final _id_consumeOnSameThread = _class.staticMethodId(
@@ -8989,7 +5585,7 @@
             _id_consumeOnSameThread as jni$_.JMethodIDPtr,
             _$stringConverter.pointer,
             _$string.pointer)
-        .object<jni$_.JInteger?>(const jni$_.$JInteger$NullableType$());
+        .object<jni$_.JInteger?>();
   }
 
   static final _id_consumeOnAnotherThread = _class.staticMethodId(
@@ -9028,47 +5624,7 @@
             _id_consumeOnAnotherThread as jni$_.JMethodIDPtr,
             _$stringConverter.pointer,
             _$string.pointer)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
-  }
-}
-
-final class $StringConverterConsumer$NullableType$
-    extends jni$_.JType<StringConverterConsumer?> {
-  @jni$_.internal
-  const $StringConverterConsumer$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/interfaces/StringConverterConsumer;';
-
-  @jni$_.internal
-  @core$_.override
-  StringConverterConsumer? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : StringConverterConsumer.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringConverterConsumer?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($StringConverterConsumer$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringConverterConsumer$NullableType$) &&
-        other is $StringConverterConsumer$NullableType$;
+        .object<jni$_.JObject?>();
   }
 }
 
@@ -9081,73 +5637,16 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/interfaces/StringConverterConsumer;';
-
-  @jni$_.internal
-  @core$_.override
-  StringConverterConsumer fromReference(jni$_.JReference reference) =>
-      StringConverterConsumer.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<StringConverterConsumer?> get nullableType =>
-      const $StringConverterConsumer$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($StringConverterConsumer$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($StringConverterConsumer$Type$) &&
-        other is $StringConverterConsumer$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.inheritance.BaseClass`
-class BaseClass<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<BaseClass<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  BaseClass.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type BaseClass<$T extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/inheritance/BaseClass');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<BaseClass<$T>?> nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $BaseClass$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<BaseClass<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $BaseClass$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<BaseClass> type = $BaseClass$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -9166,146 +5665,31 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory BaseClass({
-    required jni$_.JType<$T> T,
-  }) {
-    return BaseClass<$T>.fromReference(
-        T,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory BaseClass() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<BaseClass<$T>>();
   }
 }
 
-final class $BaseClass$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<BaseClass<$T>?> {
+final class $BaseClass$Type$ extends jni$_.JType<BaseClass> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $BaseClass$NullableType$(
-    this.T,
-  );
+  const $BaseClass$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/inheritance/BaseClass;';
-
-  @jni$_.internal
-  @core$_.override
-  BaseClass<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : BaseClass<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<BaseClass<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($BaseClass$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($BaseClass$NullableType$<$T>) &&
-        other is $BaseClass$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $BaseClass$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<BaseClass<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $BaseClass$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/inheritance/BaseClass;';
-
-  @jni$_.internal
-  @core$_.override
-  BaseClass<$T> fromReference(jni$_.JReference reference) =>
-      BaseClass<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<BaseClass<$T>?> get nullableType =>
-      $BaseClass$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($BaseClass$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($BaseClass$Type$<$T>) &&
-        other is $BaseClass$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.inheritance.BaseGenericInterface`
-class BaseGenericInterface<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<BaseGenericInterface<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  BaseGenericInterface.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type BaseGenericInterface<$T extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/inheritance/BaseGenericInterface');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<BaseGenericInterface<$T>?>
-      nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $BaseGenericInterface$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<BaseGenericInterface<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $BaseGenericInterface$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<BaseGenericInterface> type =
+      $BaseGenericInterface$Type$();
   static final _id_foo = _class.instanceMethodId(
     r'foo',
     r'()Ljava/lang/Object;',
@@ -9326,8 +5710,7 @@
   /// from: `public abstract T foo()`
   /// The returned object must be released after use, by calling the [release] method.
   $T? foo() {
-    return _foo(reference.pointer, _id_foo as jni$_.JMethodIDPtr)
-        .object<$T?>(T.nullableType);
+    return _foo(reference.pointer, _id_foo as jni$_.JMethodIDPtr).object<$T?>();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -9404,34 +5787,24 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return BaseGenericInterface<$T>.fromReference(
-      $impl.T,
-      $i.implementReference(),
-    );
+    return $i.implement<BaseGenericInterface<$T>>();
   }
 }
 
 abstract base mixin class $BaseGenericInterface<$T extends jni$_.JObject?> {
   factory $BaseGenericInterface({
-    required jni$_.JType<$T> T,
     required $T? Function() foo,
   }) = _$BaseGenericInterface<$T>;
 
-  jni$_.JType<$T> get T;
-
   $T? foo();
 }
 
 final class _$BaseGenericInterface<$T extends jni$_.JObject?>
     with $BaseGenericInterface<$T> {
   _$BaseGenericInterface({
-    required this.T,
     required $T? Function() foo,
   }) : _foo = foo;
 
-  @core$_.override
-  final jni$_.JType<$T> T;
-
   final $T? Function() _foo;
 
   $T? foo() {
@@ -9439,119 +5812,23 @@
   }
 }
 
-final class $BaseGenericInterface$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<BaseGenericInterface<$T>?> {
+final class $BaseGenericInterface$Type$
+    extends jni$_.JType<BaseGenericInterface> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $BaseGenericInterface$NullableType$(
-    this.T,
-  );
+  const $BaseGenericInterface$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/inheritance/BaseGenericInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  BaseGenericInterface<$T>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : BaseGenericInterface<$T>.fromReference(
-              T,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<BaseGenericInterface<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($BaseGenericInterface$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($BaseGenericInterface$NullableType$<$T>) &&
-        other is $BaseGenericInterface$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $BaseGenericInterface$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<BaseGenericInterface<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $BaseGenericInterface$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/inheritance/BaseGenericInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  BaseGenericInterface<$T> fromReference(jni$_.JReference reference) =>
-      BaseGenericInterface<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<BaseGenericInterface<$T>?> get nullableType =>
-      $BaseGenericInterface$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($BaseGenericInterface$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($BaseGenericInterface$Type$<$T>) &&
-        other is $BaseGenericInterface$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.inheritance.BaseInterface`
-class BaseInterface extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<BaseInterface> $type;
-
-  @jni$_.internal
-  BaseInterface.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type BaseInterface._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/inheritance/BaseInterface');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<BaseInterface?> nullableType =
-      $BaseInterface$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<BaseInterface> type = $BaseInterface$Type$();
   static final _id_foo = _class.instanceMethodId(
     r'foo',
@@ -9574,7 +5851,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString? foo() {
     return _foo(reference.pointer, _id_foo as jni$_.JMethodIDPtr)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -9651,9 +5928,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return BaseInterface.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<BaseInterface>();
   }
 }
 
@@ -9677,44 +5952,6 @@
   }
 }
 
-final class $BaseInterface$NullableType$ extends jni$_.JType<BaseInterface?> {
-  @jni$_.internal
-  const $BaseInterface$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/inheritance/BaseInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  BaseInterface? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : BaseInterface.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<BaseInterface?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($BaseInterface$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($BaseInterface$NullableType$) &&
-        other is $BaseInterface$NullableType$;
-  }
-}
-
 final class $BaseInterface$Type$ extends jni$_.JType<BaseInterface> {
   @jni$_.internal
   const $BaseInterface$Type$();
@@ -9723,56 +5960,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/inheritance/BaseInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  BaseInterface fromReference(jni$_.JReference reference) =>
-      BaseInterface.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<BaseInterface?> get nullableType =>
-      const $BaseInterface$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($BaseInterface$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($BaseInterface$Type$) &&
-        other is $BaseInterface$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.inheritance.DerivedInterface`
-class DerivedInterface extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<DerivedInterface> $type;
-
-  @jni$_.internal
-  DerivedInterface.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type DerivedInterface._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/inheritance/DerivedInterface');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<DerivedInterface?> nullableType =
-      $DerivedInterface$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<DerivedInterface> type = $DerivedInterface$Type$();
   static final _id_foo = _class.instanceMethodId(
     r'foo',
@@ -9795,7 +5991,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString? foo() {
     return _foo(reference.pointer, _id_foo as jni$_.JMethodIDPtr)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -9872,9 +6068,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return DerivedInterface.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<DerivedInterface>();
   }
 }
 
@@ -9898,46 +6092,6 @@
   }
 }
 
-final class $DerivedInterface$NullableType$
-    extends jni$_.JType<DerivedInterface?> {
-  @jni$_.internal
-  const $DerivedInterface$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/inheritance/DerivedInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  DerivedInterface? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : DerivedInterface.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<DerivedInterface?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($DerivedInterface$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($DerivedInterface$NullableType$) &&
-        other is $DerivedInterface$NullableType$;
-  }
-}
-
 final class $DerivedInterface$Type$ extends jni$_.JType<DerivedInterface> {
   @jni$_.internal
   const $DerivedInterface$Type$();
@@ -9946,74 +6100,17 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/inheritance/DerivedInterface;';
-
-  @jni$_.internal
-  @core$_.override
-  DerivedInterface fromReference(jni$_.JReference reference) =>
-      DerivedInterface.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<DerivedInterface?> get nullableType =>
-      const $DerivedInterface$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($DerivedInterface$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($DerivedInterface$Type$) &&
-        other is $DerivedInterface$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.inheritance.GenericDerivedClass`
-class GenericDerivedClass<$T extends jni$_.JObject?> extends BaseClass<$T?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<GenericDerivedClass<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  GenericDerivedClass.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(T.nullableType, reference);
-
+extension type GenericDerivedClass<$T extends jni$_.JObject?>._(
+    jni$_.JObject _$this) implements BaseClass<$T?> {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/inheritance/GenericDerivedClass');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GenericDerivedClass<$T>?>
-      nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $GenericDerivedClass$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<GenericDerivedClass<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $GenericDerivedClass$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<GenericDerivedClass> type =
+      $GenericDerivedClass$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -10032,129 +6129,30 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory GenericDerivedClass({
-    required jni$_.JType<$T> T,
-  }) {
-    return GenericDerivedClass<$T>.fromReference(
-        T,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory GenericDerivedClass() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<GenericDerivedClass<$T>>();
   }
 }
 
-final class $GenericDerivedClass$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<GenericDerivedClass<$T>?> {
+final class $GenericDerivedClass$Type$
+    extends jni$_.JType<GenericDerivedClass> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $GenericDerivedClass$NullableType$(
-    this.T,
-  );
+  const $GenericDerivedClass$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/inheritance/GenericDerivedClass;';
-
-  @jni$_.internal
-  @core$_.override
-  GenericDerivedClass<$T>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : GenericDerivedClass<$T>.fromReference(
-              T,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => $BaseClass$NullableType$<$T?>(T.nullableType);
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GenericDerivedClass<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => Object.hash($GenericDerivedClass$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GenericDerivedClass$NullableType$<$T>) &&
-        other is $GenericDerivedClass$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $GenericDerivedClass$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<GenericDerivedClass<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $GenericDerivedClass$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/inheritance/GenericDerivedClass;';
-
-  @jni$_.internal
-  @core$_.override
-  GenericDerivedClass<$T> fromReference(jni$_.JReference reference) =>
-      GenericDerivedClass<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => $BaseClass$NullableType$<$T?>(T.nullableType);
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<GenericDerivedClass<$T>?> get nullableType =>
-      $GenericDerivedClass$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => Object.hash($GenericDerivedClass$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($GenericDerivedClass$Type$<$T>) &&
-        other is $GenericDerivedClass$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.inheritance.SpecificDerivedClass`
-class SpecificDerivedClass extends BaseClass<jni$_.JString?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<SpecificDerivedClass> $type;
-
-  @jni$_.internal
-  SpecificDerivedClass.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(const jni$_.$JString$NullableType$(), reference);
-
+extension type SpecificDerivedClass._(jni$_.JObject _$this)
+    implements BaseClass<jni$_.JString?> {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/inheritance/SpecificDerivedClass');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<SpecificDerivedClass?> nullableType =
-      $SpecificDerivedClass$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<SpecificDerivedClass> type =
       $SpecificDerivedClass$Type$();
   static final _id_new$ = _class.constructorId(
@@ -10176,50 +6174,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory SpecificDerivedClass() {
-    return SpecificDerivedClass.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $SpecificDerivedClass$NullableType$
-    extends jni$_.JType<SpecificDerivedClass?> {
-  @jni$_.internal
-  const $SpecificDerivedClass$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/inheritance/SpecificDerivedClass;';
-
-  @jni$_.internal
-  @core$_.override
-  SpecificDerivedClass? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : SpecificDerivedClass.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const $BaseClass$NullableType$<jni$_.JString?>(
-      jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<SpecificDerivedClass?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => ($SpecificDerivedClass$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($SpecificDerivedClass$NullableType$) &&
-        other is $SpecificDerivedClass$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<SpecificDerivedClass>();
   }
 }
 
@@ -10232,107 +6188,20 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/inheritance/SpecificDerivedClass;';
-
-  @jni$_.internal
-  @core$_.override
-  SpecificDerivedClass fromReference(jni$_.JReference reference) =>
-      SpecificDerivedClass.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const $BaseClass$NullableType$<jni$_.JString?>(
-      jni$_.$JString$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<SpecificDerivedClass?> get nullableType =>
-      const $SpecificDerivedClass$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => ($SpecificDerivedClass$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($SpecificDerivedClass$Type$) &&
-        other is $SpecificDerivedClass$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.Annotated$Nested`
-class Annotated$Nested<$T extends jni$_.JObject?, $U extends jni$_.JObject,
-    $W extends jni$_.JObject, $V extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Annotated$Nested<$T, $U, $W, $V>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$W> W;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  Annotated$Nested.fromReference(
-    this.T,
-    this.U,
-    this.W,
-    this.V,
-    jni$_.JReference reference,
-  )   : $type = type<$T, $U, $W, $V>(T, U, W, V),
-        super.fromReference(reference);
-
+extension type Annotated$Nested<
+        $T extends jni$_.JObject?,
+        $U extends jni$_.JObject,
+        $W extends jni$_.JObject,
+        $V extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/annotations/Annotated$Nested');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<Annotated$Nested<$T, $U, $W, $V>?> nullableType<
-      $T extends jni$_.JObject?,
-      $U extends jni$_.JObject,
-      $W extends jni$_.JObject,
-      $V extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$U> U,
-    jni$_.JType<$W> W,
-    jni$_.JType<$V> V,
-  ) {
-    return $Annotated$Nested$NullableType$<$T, $U, $W, $V>(
-      T,
-      U,
-      W,
-      V,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<Annotated$Nested<$T, $U, $W, $V>> type<
-      $T extends jni$_.JObject?,
-      $U extends jni$_.JObject,
-      $W extends jni$_.JObject,
-      $V extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$U> U,
-    jni$_.JType<$W> W,
-    jni$_.JType<$V> V,
-  ) {
-    return $Annotated$Nested$Type$<$T, $U, $W, $V>(
-      T,
-      U,
-      W,
-      V,
-    );
-  }
-
+  static const jni$_.JType<Annotated$Nested> type = $Annotated$Nested$Type$();
   static final _id_v = _class.instanceFieldId(
     r'v',
     r'Ljava/lang/Object;',
@@ -10340,11 +6209,12 @@
 
   /// from: `public V v`
   /// The returned object must be released after use, by calling the [release] method.
-  $V? get v => _id_v.get(this, V.nullableType);
+  $V? get v => _id_v.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public V v`
   /// The returned object must be released after use, by calling the [release] method.
-  set v($V? value) => _id_v.set(this, V.nullableType, value);
+  set v($V? value) =>
+      _id_v.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_u = _class.instanceFieldId(
     r'u',
@@ -10353,11 +6223,11 @@
 
   /// from: `public U u`
   /// The returned object must be released after use, by calling the [release] method.
-  $U get u => _id_u.get(this, U);
+  $U get u => _id_u.get(this, const jni$_.$JObject$Type$());
 
   /// from: `public U u`
   /// The returned object must be released after use, by calling the [release] method.
-  set u($U value) => _id_u.set(this, U, value);
+  set u($U value) => _id_u.set(this, const jni$_.$JObject$Type$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Lcom/github/dart_lang/jnigen/annotations/Annotated;Ljava/lang/Object;)V',
@@ -10384,236 +6254,34 @@
   /// The returned object must be released after use, by calling the [release] method.
   factory Annotated$Nested(
     Annotated<$T?, $U, $W> $outerClass,
-    $V? object, {
-    jni$_.JType<$T>? T,
-    jni$_.JType<$U>? U,
-    jni$_.JType<$W>? W,
-    required jni$_.JType<$V> V,
-  }) {
-    T ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $Annotated$Type$<core$_.dynamic, core$_.dynamic,
-              core$_.dynamic>)
-          .T,
-    ]) as jni$_.JType<$T>;
-    U ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $Annotated$Type$<core$_.dynamic, core$_.dynamic,
-              core$_.dynamic>)
-          .U,
-    ]) as jni$_.JType<$U>;
-    W ??= jni$_.lowestCommonSuperType([
-      ($outerClass.$type as $Annotated$Type$<core$_.dynamic, core$_.dynamic,
-              core$_.dynamic>)
-          .W,
-    ]) as jni$_.JType<$W>;
+    $V? object,
+  ) {
     final _$$outerClass = $outerClass.reference;
     final _$object = object?.reference ?? jni$_.jNullReference;
-    return Annotated$Nested<$T, $U, $W, $V>.fromReference(
-        T,
-        U,
-        W,
-        V,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$$outerClass.pointer, _$object.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$$outerClass.pointer, _$object.pointer)
+        .object<Annotated$Nested<$T, $U, $W, $V>>();
   }
 }
 
-final class $Annotated$Nested$NullableType$<
-        $T extends jni$_.JObject?,
-        $U extends jni$_.JObject,
-        $W extends jni$_.JObject,
-        $V extends jni$_.JObject?>
-    extends jni$_.JType<Annotated$Nested<$T, $U, $W, $V>?> {
+final class $Annotated$Nested$Type$ extends jni$_.JType<Annotated$Nested> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$W> W;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $Annotated$Nested$NullableType$(
-    this.T,
-    this.U,
-    this.W,
-    this.V,
-  );
+  const $Annotated$Nested$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/annotations/Annotated$Nested;';
-
-  @jni$_.internal
-  @core$_.override
-  Annotated$Nested<$T, $U, $W, $V>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : Annotated$Nested<$T, $U, $W, $V>.fromReference(
-              T,
-              U,
-              W,
-              V,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Annotated$Nested<$T, $U, $W, $V>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($Annotated$Nested$NullableType$, T, U, W, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType ==
-            ($Annotated$Nested$NullableType$<$T, $U, $W, $V>) &&
-        other is $Annotated$Nested$NullableType$<$T, $U, $W, $V> &&
-        T == other.T &&
-        U == other.U &&
-        W == other.W &&
-        V == other.V;
-  }
-}
-
-final class $Annotated$Nested$Type$<
-        $T extends jni$_.JObject?,
-        $U extends jni$_.JObject,
-        $W extends jni$_.JObject,
-        $V extends jni$_.JObject?>
-    extends jni$_.JType<Annotated$Nested<$T, $U, $W, $V>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$W> W;
-
-  @jni$_.internal
-  final jni$_.JType<$V> V;
-
-  @jni$_.internal
-  const $Annotated$Nested$Type$(
-    this.T,
-    this.U,
-    this.W,
-    this.V,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/annotations/Annotated$Nested;';
-
-  @jni$_.internal
-  @core$_.override
-  Annotated$Nested<$T, $U, $W, $V> fromReference(jni$_.JReference reference) =>
-      Annotated$Nested<$T, $U, $W, $V>.fromReference(
-        T,
-        U,
-        W,
-        V,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Annotated$Nested<$T, $U, $W, $V>?> get nullableType =>
-      $Annotated$Nested$NullableType$<$T, $U, $W, $V>(T, U, W, V);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($Annotated$Nested$Type$, T, U, W, V);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Annotated$Nested$Type$<$T, $U, $W, $V>) &&
-        other is $Annotated$Nested$Type$<$T, $U, $W, $V> &&
-        T == other.T &&
-        U == other.U &&
-        W == other.W &&
-        V == other.V;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.Annotated`
-class Annotated<$T extends jni$_.JObject?, $U extends jni$_.JObject,
-    $W extends jni$_.JObject> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Annotated<$T, $U, $W>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$W> W;
-
-  @jni$_.internal
-  Annotated.fromReference(
-    this.T,
-    this.U,
-    this.W,
-    jni$_.JReference reference,
-  )   : $type = type<$T, $U, $W>(T, U, W),
-        super.fromReference(reference);
-
+extension type Annotated<$T extends jni$_.JObject?, $U extends jni$_.JObject,
+    $W extends jni$_.JObject>._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/annotations/Annotated');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<Annotated<$T, $U, $W>?> nullableType<
-      $T extends jni$_.JObject?,
-      $U extends jni$_.JObject,
-      $W extends jni$_.JObject>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$U> U,
-    jni$_.JType<$W> W,
-  ) {
-    return $Annotated$NullableType$<$T, $U, $W>(
-      T,
-      U,
-      W,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<Annotated<$T, $U, $W>> type<$T extends jni$_.JObject?,
-      $U extends jni$_.JObject, $W extends jni$_.JObject>(
-    jni$_.JType<$T> T,
-    jni$_.JType<$U> U,
-    jni$_.JType<$W> W,
-  ) {
-    return $Annotated$Type$<$T, $U, $W>(
-      T,
-      U,
-      W,
-    );
-  }
-
+  static const jni$_.JType<Annotated> type = $Annotated$Type$();
   static final _id_t = _class.instanceFieldId(
     r't',
     r'Ljava/lang/Object;',
@@ -10621,11 +6289,12 @@
 
   /// from: `public T t`
   /// The returned object must be released after use, by calling the [release] method.
-  $T? get t => _id_t.get(this, T.nullableType);
+  $T? get t => _id_t.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public T t`
   /// The returned object must be released after use, by calling the [release] method.
-  set t($T? value) => _id_t.set(this, T.nullableType, value);
+  set t($T? value) =>
+      _id_t.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_u = _class.instanceFieldId(
     r'u',
@@ -10634,11 +6303,12 @@
 
   /// from: `public U u`
   /// The returned object must be released after use, by calling the [release] method.
-  $U get u => _id_u.get(this, U);
+  $U get u => _id_u.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public U u`
   /// The returned object must be released after use, by calling the [release] method.
-  set u($U value) => _id_u.set(this, U, value);
+  set u($U value) =>
+      _id_u.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_w = _class.instanceFieldId(
     r'w',
@@ -10647,11 +6317,12 @@
 
   /// from: `public W w`
   /// The returned object must be released after use, by calling the [release] method.
-  $W get w => _id_w.get(this, W);
+  $W get w => _id_w.get(this, const jni$_.$JObject$NullableType$());
 
   /// from: `public W w`
   /// The returned object must be released after use, by calling the [release] method.
-  set w($W value) => _id_w.set(this, W, value);
+  set w($W value) =>
+      _id_w.set(this, const jni$_.$JObject$NullableType$(), value);
 
   static final _id_new$ = _class.constructorId(
     r'(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V',
@@ -10681,27 +6352,14 @@
   factory Annotated(
     $T? object,
     $U object1,
-    $W object2, {
-    required jni$_.JType<$T> T,
-    jni$_.JType<$U>? U,
-    jni$_.JType<$W>? W,
-  }) {
-    U ??= jni$_.lowestCommonSuperType([
-      object1.$type,
-    ]) as jni$_.JType<$U>;
-    W ??= jni$_.lowestCommonSuperType([
-      object2.$type,
-    ]) as jni$_.JType<$W>;
+    $W object2,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     final _$object1 = object1.reference;
     final _$object2 = object2.reference;
-    return Annotated<$T, $U, $W>.fromReference(
-        T,
-        U,
-        W,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
-                _$object.pointer, _$object1.pointer, _$object2.pointer)
-            .reference);
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr,
+            _$object.pointer, _$object1.pointer, _$object2.pointer)
+        .object<Annotated<$T, $U, $W>>();
   }
 
   static final _id_staticHello = _class.staticMethodId(
@@ -10726,7 +6384,7 @@
   static jni$_.JString staticHello() {
     return _staticHello(
             _class.reference.pointer, _id_staticHello as jni$_.JMethodIDPtr)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_hello = _class.instanceMethodId(
@@ -10750,7 +6408,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JString hello() {
     return _hello(reference.pointer, _id_hello as jni$_.JMethodIDPtr)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_nullableHello = _class.instanceMethodId(
@@ -10775,7 +6433,7 @@
   ) {
     return _nullableHello(reference.pointer,
             _id_nullableHello as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_echo = _class.instanceMethodId(
@@ -10802,7 +6460,7 @@
     final _$string = string.reference;
     return _echo(
             reference.pointer, _id_echo as jni$_.JMethodIDPtr, _$string.pointer)
-        .object<jni$_.JString>(const jni$_.$JString$Type$());
+        .object<jni$_.JString>();
   }
 
   static final _id_nullableEcho = _class.instanceMethodId(
@@ -10829,7 +6487,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _nullableEcho(reference.pointer,
             _id_nullableEcho as jni$_.JMethodIDPtr, _$string.pointer)
-        .object<jni$_.JString?>(const jni$_.$JString$NullableType$());
+        .object<jni$_.JString?>();
   }
 
   static final _id_array = _class.instanceMethodId(
@@ -10853,8 +6511,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JArray<jni$_.JString> array() {
     return _array(reference.pointer, _id_array as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<jni$_.JString>>(
-            const jni$_.$JArray$Type$<jni$_.JString>(jni$_.$JString$Type$()));
+        .object<jni$_.JArray<jni$_.JString>>();
   }
 
   static final _id_arrayOfNullable = _class.instanceMethodId(
@@ -10879,9 +6536,7 @@
   jni$_.JArray<jni$_.JString?> arrayOfNullable() {
     return _arrayOfNullable(
             reference.pointer, _id_arrayOfNullable as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<jni$_.JString?>>(
-            const jni$_.$JArray$Type$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<jni$_.JArray<jni$_.JString?>>();
   }
 
   static final _id_nullableArray = _class.instanceMethodId(
@@ -10906,9 +6561,7 @@
   ) {
     return _nullableArray(reference.pointer,
             _id_nullableArray as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JArray<jni$_.JString>?>(
-            const jni$_.$JArray$NullableType$<jni$_.JString>(
-                jni$_.$JString$Type$()));
+        .object<jni$_.JArray<jni$_.JString>?>();
   }
 
   static final _id_nullableArrayOfNullable = _class.instanceMethodId(
@@ -10933,9 +6586,7 @@
   ) {
     return _nullableArrayOfNullable(reference.pointer,
             _id_nullableArrayOfNullable as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JArray<jni$_.JString?>?>(
-            const jni$_.$JArray$NullableType$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<jni$_.JArray<jni$_.JString?>?>();
   }
 
   static final _id_list = _class.instanceMethodId(
@@ -10959,8 +6610,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JString> list() {
     return _list(reference.pointer, _id_list as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JString>>(
-            const jni$_.$JList$Type$<jni$_.JString>(jni$_.$JString$Type$()));
+        .object<jni$_.JList<jni$_.JString>>();
   }
 
   static final _id_listOfNullable = _class.instanceMethodId(
@@ -10985,9 +6635,7 @@
   jni$_.JList<jni$_.JString?> listOfNullable() {
     return _listOfNullable(
             reference.pointer, _id_listOfNullable as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JString?>>(
-            const jni$_.$JList$Type$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<jni$_.JList<jni$_.JString?>>();
   }
 
   static final _id_nullableList = _class.instanceMethodId(
@@ -11012,9 +6660,7 @@
   ) {
     return _nullableList(reference.pointer,
             _id_nullableList as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JList<jni$_.JString>?>(
-            const jni$_.$JList$NullableType$<jni$_.JString>(
-                jni$_.$JString$Type$()));
+        .object<jni$_.JList<jni$_.JString>?>();
   }
 
   static final _id_nullableListOfNullable = _class.instanceMethodId(
@@ -11039,9 +6685,7 @@
   ) {
     return _nullableListOfNullable(reference.pointer,
             _id_nullableListOfNullable as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JList<jni$_.JString?>?>(
-            const jni$_.$JList$NullableType$<jni$_.JString?>(
-                jni$_.$JString$NullableType$()));
+        .object<jni$_.JList<jni$_.JString?>?>();
   }
 
   static final _id_classGenericEcho = _class.instanceMethodId(
@@ -11068,7 +6712,7 @@
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _classGenericEcho(reference.pointer,
             _id_classGenericEcho as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$T>(T);
+        .object<$T>();
   }
 
   static final _id_nullableClassGenericEcho = _class.instanceMethodId(
@@ -11097,7 +6741,7 @@
             reference.pointer,
             _id_nullableClassGenericEcho as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_methodGenericEcho = _class.instanceMethodId(
@@ -11119,13 +6763,12 @@
   /// from: `public V methodGenericEcho(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericEcho<$V extends jni$_.JObject?>(
-    $V object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _methodGenericEcho(reference.pointer,
             _id_methodGenericEcho as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_methodGenericEcho2 = _class.instanceMethodId(
@@ -11147,16 +6790,12 @@
   /// from: `public V methodGenericEcho2(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericEcho2<$V extends jni$_.JObject>(
-    $V object, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      object.$type,
-    ]) as jni$_.JType<$V>;
+    $V object,
+  ) {
     final _$object = object.reference;
     return _methodGenericEcho2(reference.pointer,
             _id_methodGenericEcho2 as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_methodGenericEcho3 = _class.instanceMethodId(
@@ -11178,16 +6817,12 @@
   /// from: `public V methodGenericEcho3(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   $V methodGenericEcho3<$V extends jni$_.JObject>(
-    $V object, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      object.$type,
-    ]) as jni$_.JType<$V>;
+    $V object,
+  ) {
     final _$object = object.reference;
     return _methodGenericEcho3(reference.pointer,
             _id_methodGenericEcho3 as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_nullableReturnMethodGenericEcho = _class.instanceMethodId(
@@ -11214,16 +6849,15 @@
   /// The returned object must be released after use, by calling the [release] method.
   $V? nullableReturnMethodGenericEcho<$V extends jni$_.JObject?>(
     $V object,
-    bool z, {
-    required jni$_.JType<$V> V,
-  }) {
+    bool z,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _nullableReturnMethodGenericEcho(
             reference.pointer,
             _id_nullableReturnMethodGenericEcho as jni$_.JMethodIDPtr,
             _$object.pointer,
             z ? 1 : 0)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_nullableReturnMethodGenericEcho2 = _class.instanceMethodId(
@@ -11250,19 +6884,15 @@
   /// The returned object must be released after use, by calling the [release] method.
   $V? nullableReturnMethodGenericEcho2<$V extends jni$_.JObject>(
     $V object,
-    bool z, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      object.$type,
-    ]) as jni$_.JType<$V>;
+    bool z,
+  ) {
     final _$object = object.reference;
     return _nullableReturnMethodGenericEcho2(
             reference.pointer,
             _id_nullableReturnMethodGenericEcho2 as jni$_.JMethodIDPtr,
             _$object.pointer,
             z ? 1 : 0)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_nullableMethodGenericEcho = _class.instanceMethodId(
@@ -11284,15 +6914,14 @@
   /// from: `public V nullableMethodGenericEcho(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   $V nullableMethodGenericEcho<$V extends jni$_.JObject?>(
-    $V object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _nullableMethodGenericEcho(
             reference.pointer,
             _id_nullableMethodGenericEcho as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_noAnnotationMethodGenericEcho = _class.instanceMethodId(
@@ -11315,15 +6944,14 @@
   /// from: `public V noAnnotationMethodGenericEcho(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? noAnnotationMethodGenericEcho<$V extends jni$_.JObject?>(
-    $V? object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _noAnnotationMethodGenericEcho(
             reference.pointer,
             _id_noAnnotationMethodGenericEcho as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_nullableArgMethodGenericEcho = _class.instanceMethodId(
@@ -11346,15 +6974,14 @@
   /// from: `public V nullableArgMethodGenericEcho(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   $V nullableArgMethodGenericEcho<$V extends jni$_.JObject>(
-    $V? object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V? object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _nullableArgMethodGenericEcho(
             reference.pointer,
             _id_nullableArgMethodGenericEcho as jni$_.JMethodIDPtr,
             _$object.pointer)
-        .object<$V>(V);
+        .object<$V>();
   }
 
   static final _id_classGenericList = _class.instanceMethodId(
@@ -11379,7 +7006,7 @@
   jni$_.JList<$T> classGenericList() {
     return _classGenericList(
             reference.pointer, _id_classGenericList as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<$T>>(jni$_.$JList$Type$<$T>(T));
+        .object<jni$_.JList<$T>>();
   }
 
   static final _id_classGenericListOfNullable = _class.instanceMethodId(
@@ -11405,7 +7032,7 @@
   jni$_.JList<$T?> classGenericListOfNullable() {
     return _classGenericListOfNullable(reference.pointer,
             _id_classGenericListOfNullable as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<$T?>>(jni$_.$JList$Type$<$T?>(T.nullableType));
+        .object<jni$_.JList<$T?>>();
   }
 
   static final _id_nullableClassGenericList = _class.instanceMethodId(
@@ -11430,7 +7057,7 @@
   ) {
     return _nullableClassGenericList(reference.pointer,
             _id_nullableClassGenericList as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JList<$T>?>(jni$_.$JList$NullableType$<$T>(T));
+        .object<jni$_.JList<$T>?>();
   }
 
   static final _id_nullableClassGenericListOfNullable = _class.instanceMethodId(
@@ -11457,8 +7084,7 @@
             reference.pointer,
             _id_nullableClassGenericListOfNullable as jni$_.JMethodIDPtr,
             z ? 1 : 0)
-        .object<jni$_.JList<$T?>?>(
-            jni$_.$JList$NullableType$<$T?>(T.nullableType));
+        .object<jni$_.JList<$T?>?>();
   }
 
   static final _id_methodGenericList = _class.instanceMethodId(
@@ -11480,13 +7106,12 @@
   /// from: `public java.util.List<V> methodGenericList(V object)`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<$V> methodGenericList<$V extends jni$_.JObject?>(
-    $V object, {
-    required jni$_.JType<$V> V,
-  }) {
+    $V object,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _methodGenericList(reference.pointer,
             _id_methodGenericList as jni$_.JMethodIDPtr, _$object.pointer)
-        .object<jni$_.JList<$V>>(jni$_.$JList$Type$<$V>(V));
+        .object<jni$_.JList<$V>>();
   }
 
   static final _id_methodGenericListOfNullable = _class.instanceMethodId(
@@ -11509,12 +7134,10 @@
 
   /// from: `public java.util.List<V> methodGenericListOfNullable()`
   /// The returned object must be released after use, by calling the [release] method.
-  jni$_.JList<$V?> methodGenericListOfNullable<$V extends jni$_.JObject?>({
-    required jni$_.JType<$V> V,
-  }) {
+  jni$_.JList<$V?> methodGenericListOfNullable<$V extends jni$_.JObject?>() {
     return _methodGenericListOfNullable(reference.pointer,
             _id_methodGenericListOfNullable as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<$V?>>(jni$_.$JList$Type$<$V?>(V.nullableType));
+        .object<jni$_.JList<$V?>>();
   }
 
   static final _id_nullableMethodGenericList = _class.instanceMethodId(
@@ -11538,16 +7161,15 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<$V>? nullableMethodGenericList<$V extends jni$_.JObject?>(
     $V object,
-    bool z, {
-    required jni$_.JType<$V> V,
-  }) {
+    bool z,
+  ) {
     final _$object = object?.reference ?? jni$_.jNullReference;
     return _nullableMethodGenericList(
             reference.pointer,
             _id_nullableMethodGenericList as jni$_.JMethodIDPtr,
             _$object.pointer,
             z ? 1 : 0)
-        .object<jni$_.JList<$V>?>(jni$_.$JList$NullableType$<$V>(V));
+        .object<jni$_.JList<$V>?>();
   }
 
   static final _id_nullableMethodGenericListOfNullable =
@@ -11570,15 +7192,13 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<$V?>?
       nullableMethodGenericListOfNullable<$V extends jni$_.JObject?>(
-    bool z, {
-    required jni$_.JType<$V> V,
-  }) {
+    bool z,
+  ) {
     return _nullableMethodGenericListOfNullable(
             reference.pointer,
             _id_nullableMethodGenericListOfNullable as jni$_.JMethodIDPtr,
             z ? 1 : 0)
-        .object<jni$_.JList<$V?>?>(
-            jni$_.$JList$NullableType$<$V?>(V.nullableType));
+        .object<jni$_.JList<$V?>?>();
   }
 
   static final _id_firstOfClassGenericList = _class.instanceMethodId(
@@ -11605,7 +7225,7 @@
     final _$list = list.reference;
     return _firstOfClassGenericList(reference.pointer,
             _id_firstOfClassGenericList as jni$_.JMethodIDPtr, _$list.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstOfClassGenericNullableList = _class.instanceMethodId(
@@ -11635,7 +7255,7 @@
             reference.pointer,
             _id_firstOfClassGenericNullableList as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstOfClassGenericListOfNullable = _class.instanceMethodId(
@@ -11665,7 +7285,7 @@
             reference.pointer,
             _id_firstOfClassGenericListOfNullable as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstOfClassGenericNullableListOfNullable =
@@ -11696,7 +7316,7 @@
             reference.pointer,
             _id_firstOfClassGenericNullableListOfNullable as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstOfMethodGenericList = _class.instanceMethodId(
@@ -11718,16 +7338,12 @@
   /// from: `public V firstOfMethodGenericList(java.util.List<V> list)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstOfMethodGenericList<$V extends jni$_.JObject?>(
-    jni$_.JList<$V> list, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (list.$type as jni$_.$JList$Type$<core$_.dynamic>).E,
-    ]) as jni$_.JType<$V>;
+    jni$_.JList<$V> list,
+  ) {
     final _$list = list.reference;
     return _firstOfMethodGenericList(reference.pointer,
             _id_firstOfMethodGenericList as jni$_.JMethodIDPtr, _$list.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstOfMethodGenericNullableList = _class.instanceMethodId(
@@ -11750,15 +7366,14 @@
   /// from: `public V firstOfMethodGenericNullableList(java.util.List<V> list)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstOfMethodGenericNullableList<$V extends jni$_.JObject?>(
-    jni$_.JList<$V>? list, {
-    required jni$_.JType<$V> V,
-  }) {
+    jni$_.JList<$V>? list,
+  ) {
     final _$list = list?.reference ?? jni$_.jNullReference;
     return _firstOfMethodGenericNullableList(
             reference.pointer,
             _id_firstOfMethodGenericNullableList as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstOfMethodGenericListOfNullable = _class.instanceMethodId(
@@ -11781,18 +7396,14 @@
   /// from: `public V firstOfMethodGenericListOfNullable(java.util.List<V> list)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstOfMethodGenericListOfNullable<$V extends jni$_.JObject?>(
-    jni$_.JList<$V?> list, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (list.$type as jni$_.$JList$Type$<core$_.dynamic>).E,
-    ]) as jni$_.JType<$V>;
+    jni$_.JList<$V?> list,
+  ) {
     final _$list = list.reference;
     return _firstOfMethodGenericListOfNullable(
             reference.pointer,
             _id_firstOfMethodGenericListOfNullable as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstOfMethodGenericNullableListOfNullable =
@@ -11816,16 +7427,15 @@
   /// from: `public V firstOfMethodGenericNullableListOfNullable(java.util.List<V> list)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstOfMethodGenericNullableListOfNullable<$V extends jni$_.JObject?>(
-    jni$_.JList<$V?>? list, {
-    required jni$_.JType<$V> V,
-  }) {
+    jni$_.JList<$V?>? list,
+  ) {
     final _$list = list?.reference ?? jni$_.jNullReference;
     return _firstOfMethodGenericNullableListOfNullable(
             reference.pointer,
             _id_firstOfMethodGenericNullableListOfNullable
                 as jni$_.JMethodIDPtr,
             _$list.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstKeyOfComboMap = _class.instanceMethodId(
@@ -11847,16 +7457,12 @@
   /// from: `public T firstKeyOfComboMap(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $T? firstKeyOfComboMap<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T, $V> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T, $V> map,
+  ) {
     final _$map = map.reference;
     return _firstKeyOfComboMap(reference.pointer,
             _id_firstKeyOfComboMap as jni$_.JMethodIDPtr, _$map.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstValueOfComboMap = _class.instanceMethodId(
@@ -11878,16 +7484,12 @@
   /// from: `public V firstValueOfComboMap(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstValueOfComboMap<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T, $V> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T, $V> map,
+  ) {
     final _$map = map.reference;
     return _firstValueOfComboMap(reference.pointer,
             _id_firstValueOfComboMap as jni$_.JMethodIDPtr, _$map.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstKeyOfComboMapNullableKey = _class.instanceMethodId(
@@ -11910,18 +7512,14 @@
   /// from: `public T firstKeyOfComboMapNullableKey(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $T? firstKeyOfComboMapNullableKey<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T?, $V> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T?, $V> map,
+  ) {
     final _$map = map.reference;
     return _firstKeyOfComboMapNullableKey(
             reference.pointer,
             _id_firstKeyOfComboMapNullableKey as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstValueOfComboMapNullableKey = _class.instanceMethodId(
@@ -11944,18 +7542,14 @@
   /// from: `public V firstValueOfComboMapNullableKey(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstValueOfComboMapNullableKey<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T?, $V> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T?, $V> map,
+  ) {
     final _$map = map.reference;
     return _firstValueOfComboMapNullableKey(
             reference.pointer,
             _id_firstValueOfComboMapNullableKey as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstKeyOfComboMapNullableValue = _class.instanceMethodId(
@@ -11978,18 +7572,14 @@
   /// from: `public T firstKeyOfComboMapNullableValue(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $T? firstKeyOfComboMapNullableValue<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T, $V?> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T, $V?> map,
+  ) {
     final _$map = map.reference;
     return _firstKeyOfComboMapNullableValue(
             reference.pointer,
             _id_firstKeyOfComboMapNullableValue as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstValueOfComboMapNullableValue = _class.instanceMethodId(
@@ -12012,18 +7602,14 @@
   /// from: `public V firstValueOfComboMapNullableValue(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstValueOfComboMapNullableValue<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T, $V?> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T, $V?> map,
+  ) {
     final _$map = map.reference;
     return _firstValueOfComboMapNullableValue(
             reference.pointer,
             _id_firstValueOfComboMapNullableValue as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstKeyOfComboMapNullableKeyAndValue =
@@ -12047,18 +7633,14 @@
   /// from: `public T firstKeyOfComboMapNullableKeyAndValue(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $T? firstKeyOfComboMapNullableKeyAndValue<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T?, $V?> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T?, $V?> map,
+  ) {
     final _$map = map.reference;
     return _firstKeyOfComboMapNullableKeyAndValue(
             reference.pointer,
             _id_firstKeyOfComboMapNullableKeyAndValue as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$T?>(T.nullableType);
+        .object<$T?>();
   }
 
   static final _id_firstValueOfComboMapNullableKeyAndValue =
@@ -12082,18 +7664,14 @@
   /// from: `public V firstValueOfComboMapNullableKeyAndValue(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   $V? firstValueOfComboMapNullableKeyAndValue<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T?, $V?> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T?, $V?> map,
+  ) {
     final _$map = map.reference;
     return _firstValueOfComboMapNullableKeyAndValue(
             reference.pointer,
             _id_firstValueOfComboMapNullableKeyAndValue as jni$_.JMethodIDPtr,
             _$map.pointer)
-        .object<$V?>(V.nullableType);
+        .object<$V?>();
   }
 
   static final _id_firstEntryOfComboMap = _class.instanceMethodId(
@@ -12115,16 +7693,12 @@
   /// from: `public java.util.Map$Entry<T, V> firstEntryOfComboMap(java.util.Map<T, V> map)`
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JObject? firstEntryOfComboMap<$V extends jni$_.JObject?>(
-    jni$_.JMap<$T, $V> map, {
-    jni$_.JType<$V>? V,
-  }) {
-    V ??= jni$_.lowestCommonSuperType([
-      (map.$type as jni$_.$JMap$Type$<core$_.dynamic, core$_.dynamic>).V,
-    ]) as jni$_.JType<$V>;
+    jni$_.JMap<$T, $V> map,
+  ) {
     final _$map = map.reference;
     return _firstEntryOfComboMap(reference.pointer,
             _id_firstEntryOfComboMap as jni$_.JMethodIDPtr, _$map.pointer)
-        .object<jni$_.JObject?>(const jni$_.$JObject$NullableType$());
+        .object<jni$_.JObject?>();
   }
 
   static final _id_getW = _class.instanceMethodId(
@@ -12148,7 +7722,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   $W getW() {
     return _getW(reference.pointer, _id_getW as jni$_.JMethodIDPtr)
-        .object<$W>(W);
+        .object<$W>();
   }
 
   static final _id_nullableGetW = _class.instanceMethodId(
@@ -12173,7 +7747,7 @@
   ) {
     return _nullableGetW(reference.pointer,
             _id_nullableGetW as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<$W?>(W.nullableType);
+        .object<$W?>();
   }
 
   static final _id_list3dOfT = _class.instanceMethodId(
@@ -12197,10 +7771,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JList<jni$_.JList<$T?>>> list3dOfT() {
     return _list3dOfT(reference.pointer, _id_list3dOfT as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JList<jni$_.JList<$T?>>>>(
-            jni$_.$JList$Type$<jni$_.JList<jni$_.JList<$T?>>>(
-                jni$_.$JList$Type$<jni$_.JList<$T?>>(
-                    jni$_.$JList$Type$<$T?>(T.nullableType))));
+        .object<jni$_.JList<jni$_.JList<jni$_.JList<$T?>>>>();
   }
 
   static final _id_list3dOfU = _class.instanceMethodId(
@@ -12224,9 +7795,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JList<jni$_.JList<$U>>> list3dOfU() {
     return _list3dOfU(reference.pointer, _id_list3dOfU as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JList<jni$_.JList<$U>>>>(
-            jni$_.$JList$Type$<jni$_.JList<jni$_.JList<$U>>>(jni$_
-                .$JList$Type$<jni$_.JList<$U>>(jni$_.$JList$Type$<$U>(U))));
+        .object<jni$_.JList<jni$_.JList<jni$_.JList<$U>>>>();
   }
 
   static final _id_list3dOfW = _class.instanceMethodId(
@@ -12250,9 +7819,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JList<jni$_.JList<$W>>> list3dOfW() {
     return _list3dOfW(reference.pointer, _id_list3dOfW as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JList<jni$_.JList<$W>>>>(
-            jni$_.$JList$Type$<jni$_.JList<jni$_.JList<$W>>>(jni$_
-                .$JList$Type$<jni$_.JList<$W>>(jni$_.$JList$Type$<$W>(W))));
+        .object<jni$_.JList<jni$_.JList<jni$_.JList<$W>>>>();
   }
 
   static final _id_list3dOfNullableU = _class.instanceMethodId(
@@ -12277,10 +7844,7 @@
   ) {
     return _list3dOfNullableU(reference.pointer,
             _id_list3dOfNullableU as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JList<jni$_.JList<jni$_.JList<$U?>>>>(
-            jni$_.$JList$Type$<jni$_.JList<jni$_.JList<$U?>>>(
-                jni$_.$JList$Type$<jni$_.JList<$U?>>(
-                    jni$_.$JList$Type$<$U?>(U.nullableType))));
+        .object<jni$_.JList<jni$_.JList<jni$_.JList<$U?>>>>();
   }
 
   static final _id_list3dOfNullableW = _class.instanceMethodId(
@@ -12305,10 +7869,7 @@
   ) {
     return _list3dOfNullableW(reference.pointer,
             _id_list3dOfNullableW as jni$_.JMethodIDPtr, z ? 1 : 0)
-        .object<jni$_.JList<jni$_.JList<jni$_.JList<$W?>>>>(
-            jni$_.$JList$Type$<jni$_.JList<jni$_.JList<$W?>>>(
-                jni$_.$JList$Type$<jni$_.JList<$W?>>(
-                    jni$_.$JList$Type$<$W?>(W.nullableType))));
+        .object<jni$_.JList<jni$_.JList<jni$_.JList<$W?>>>>();
   }
 
   static final _id_nested = _class.instanceMethodId(
@@ -12332,9 +7893,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   Annotated$Nested<$T?, $U, $W, jni$_.JInteger>? nested() {
     return _nested(reference.pointer, _id_nested as jni$_.JMethodIDPtr)
-        .object<Annotated$Nested<$T?, $U, $W, jni$_.JInteger>?>(
-            $Annotated$Nested$NullableType$<$T?, $U, $W, jni$_.JInteger>(
-                T.nullableType, U, W, const jni$_.$JInteger$Type$()));
+        .object<Annotated$Nested<$T?, $U, $W, jni$_.JInteger>?>();
   }
 
   static final _id_intList = _class.instanceMethodId(
@@ -12358,152 +7917,27 @@
   /// The returned object must be released after use, by calling the [release] method.
   jni$_.JList<jni$_.JInteger> intList() {
     return _intList(reference.pointer, _id_intList as jni$_.JMethodIDPtr)
-        .object<jni$_.JList<jni$_.JInteger>>(
-            const jni$_.$JList$Type$<jni$_.JInteger>(jni$_.$JInteger$Type$()));
+        .object<jni$_.JList<jni$_.JInteger>>();
   }
 }
 
-final class $Annotated$NullableType$<
-    $T extends jni$_.JObject?,
-    $U extends jni$_.JObject,
-    $W extends jni$_.JObject> extends jni$_.JType<Annotated<$T, $U, $W>?> {
+final class $Annotated$Type$ extends jni$_.JType<Annotated> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$W> W;
-
-  @jni$_.internal
-  const $Annotated$NullableType$(
-    this.T,
-    this.U,
-    this.W,
-  );
+  const $Annotated$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/annotations/Annotated;';
-
-  @jni$_.internal
-  @core$_.override
-  Annotated<$T, $U, $W>? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : Annotated<$T, $U, $W>.fromReference(
-              T,
-              U,
-              W,
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Annotated<$T, $U, $W>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($Annotated$NullableType$, T, U, W);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Annotated$NullableType$<$T, $U, $W>) &&
-        other is $Annotated$NullableType$<$T, $U, $W> &&
-        T == other.T &&
-        U == other.U &&
-        W == other.W;
-  }
-}
-
-final class $Annotated$Type$<
-    $T extends jni$_.JObject?,
-    $U extends jni$_.JObject,
-    $W extends jni$_.JObject> extends jni$_.JType<Annotated<$T, $U, $W>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  final jni$_.JType<$U> U;
-
-  @jni$_.internal
-  final jni$_.JType<$W> W;
-
-  @jni$_.internal
-  const $Annotated$Type$(
-    this.T,
-    this.U,
-    this.W,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/annotations/Annotated;';
-
-  @jni$_.internal
-  @core$_.override
-  Annotated<$T, $U, $W> fromReference(jni$_.JReference reference) =>
-      Annotated<$T, $U, $W>.fromReference(
-        T,
-        U,
-        W,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Annotated<$T, $U, $W>?> get nullableType =>
-      $Annotated$NullableType$<$T, $U, $W>(T, U, W);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($Annotated$Type$, T, U, W);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Annotated$Type$<$T, $U, $W>) &&
-        other is $Annotated$Type$<$T, $U, $W> &&
-        T == other.T &&
-        U == other.U &&
-        W == other.W;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.JsonSerializable$Case`
-class JsonSerializable$Case extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<JsonSerializable$Case> $type;
-
-  @jni$_.internal
-  JsonSerializable$Case.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type JsonSerializable$Case._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/annotations/JsonSerializable$Case');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<JsonSerializable$Case?> nullableType =
-      $JsonSerializable$Case$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<JsonSerializable$Case> type =
       $JsonSerializable$Case$Type$();
   static final _id_SNAKE_CASE = _class.staticFieldId(
@@ -12514,7 +7948,7 @@
   /// from: `static public final com.github.dart_lang.jnigen.annotations.JsonSerializable$Case SNAKE_CASE`
   /// The returned object must be released after use, by calling the [release] method.
   static JsonSerializable$Case get SNAKE_CASE =>
-      _id_SNAKE_CASE.get(_class, const $JsonSerializable$Case$Type$());
+      _id_SNAKE_CASE.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_KEBAB_CASE = _class.staticFieldId(
     r'KEBAB_CASE',
@@ -12524,7 +7958,7 @@
   /// from: `static public final com.github.dart_lang.jnigen.annotations.JsonSerializable$Case KEBAB_CASE`
   /// The returned object must be released after use, by calling the [release] method.
   static JsonSerializable$Case get KEBAB_CASE =>
-      _id_KEBAB_CASE.get(_class, const $JsonSerializable$Case$Type$());
+      _id_KEBAB_CASE.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_CAMEL_CASE = _class.staticFieldId(
     r'CAMEL_CASE',
@@ -12534,7 +7968,7 @@
   /// from: `static public final com.github.dart_lang.jnigen.annotations.JsonSerializable$Case CAMEL_CASE`
   /// The returned object must be released after use, by calling the [release] method.
   static JsonSerializable$Case get CAMEL_CASE =>
-      _id_CAMEL_CASE.get(_class, const $JsonSerializable$Case$Type$());
+      _id_CAMEL_CASE.get(_class, const jni$_.$JObject$NullableType$());
 
   static final _id_values = _class.staticMethodId(
     r'values',
@@ -12557,9 +7991,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   static jni$_.JArray<JsonSerializable$Case?>? values() {
     return _values(_class.reference.pointer, _id_values as jni$_.JMethodIDPtr)
-        .object<jni$_.JArray<JsonSerializable$Case?>?>(
-            const jni$_.$JArray$NullableType$<JsonSerializable$Case?>(
-                $JsonSerializable$Case$NullableType$()));
+        .object<jni$_.JArray<JsonSerializable$Case?>?>();
   }
 
   static final _id_valueOf = _class.staticMethodId(
@@ -12586,48 +8018,7 @@
     final _$string = string?.reference ?? jni$_.jNullReference;
     return _valueOf(_class.reference.pointer, _id_valueOf as jni$_.JMethodIDPtr,
             _$string.pointer)
-        .object<JsonSerializable$Case?>(
-            const $JsonSerializable$Case$NullableType$());
-  }
-}
-
-final class $JsonSerializable$Case$NullableType$
-    extends jni$_.JType<JsonSerializable$Case?> {
-  @jni$_.internal
-  const $JsonSerializable$Case$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;';
-
-  @jni$_.internal
-  @core$_.override
-  JsonSerializable$Case? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : JsonSerializable$Case.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<JsonSerializable$Case?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($JsonSerializable$Case$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JsonSerializable$Case$NullableType$) &&
-        other is $JsonSerializable$Case$NullableType$;
+        .object<JsonSerializable$Case?>();
   }
 }
 
@@ -12640,56 +8031,15 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;';
-
-  @jni$_.internal
-  @core$_.override
-  JsonSerializable$Case fromReference(jni$_.JReference reference) =>
-      JsonSerializable$Case.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<JsonSerializable$Case?> get nullableType =>
-      const $JsonSerializable$Case$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($JsonSerializable$Case$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JsonSerializable$Case$Type$) &&
-        other is $JsonSerializable$Case$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.JsonSerializable`
-class JsonSerializable extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<JsonSerializable> $type;
-
-  @jni$_.internal
-  JsonSerializable.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type JsonSerializable._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/annotations/JsonSerializable');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<JsonSerializable?> nullableType =
-      $JsonSerializable$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<JsonSerializable> type = $JsonSerializable$Type$();
   static final _id_value = _class.instanceMethodId(
     r'value',
@@ -12712,8 +8062,7 @@
   /// The returned object must be released after use, by calling the [release] method.
   JsonSerializable$Case? value() {
     return _value(reference.pointer, _id_value as jni$_.JMethodIDPtr)
-        .object<JsonSerializable$Case?>(
-            const $JsonSerializable$Case$NullableType$());
+        .object<JsonSerializable$Case?>();
   }
 
   /// Maps a specific port to the implemented interface.
@@ -12791,9 +8140,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return JsonSerializable.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<JsonSerializable>();
   }
 }
 
@@ -12817,46 +8164,6 @@
   }
 }
 
-final class $JsonSerializable$NullableType$
-    extends jni$_.JType<JsonSerializable?> {
-  @jni$_.internal
-  const $JsonSerializable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/annotations/JsonSerializable;';
-
-  @jni$_.internal
-  @core$_.override
-  JsonSerializable? fromReference(jni$_.JReference reference) =>
-      reference.isNull
-          ? null
-          : JsonSerializable.fromReference(
-              reference,
-            );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<JsonSerializable?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($JsonSerializable$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JsonSerializable$NullableType$) &&
-        other is $JsonSerializable$NullableType$;
-  }
-}
-
 final class $JsonSerializable$Type$ extends jni$_.JType<JsonSerializable> {
   @jni$_.internal
   const $JsonSerializable$Type$();
@@ -12865,56 +8172,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/annotations/JsonSerializable;';
-
-  @jni$_.internal
-  @core$_.override
-  JsonSerializable fromReference(jni$_.JReference reference) =>
-      JsonSerializable.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<JsonSerializable?> get nullableType =>
-      const $JsonSerializable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($JsonSerializable$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($JsonSerializable$Type$) &&
-        other is $JsonSerializable$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.MyDataClass`
-class MyDataClass extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<MyDataClass> $type;
-
-  @jni$_.internal
-  MyDataClass.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type MyDataClass._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/annotations/MyDataClass');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<MyDataClass?> nullableType =
-      $MyDataClass$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<MyDataClass> type = $MyDataClass$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -12935,47 +8200,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory MyDataClass() {
-    return MyDataClass.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $MyDataClass$NullableType$ extends jni$_.JType<MyDataClass?> {
-  @jni$_.internal
-  const $MyDataClass$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/annotations/MyDataClass;';
-
-  @jni$_.internal
-  @core$_.override
-  MyDataClass? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : MyDataClass.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyDataClass?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyDataClass$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyDataClass$NullableType$) &&
-        other is $MyDataClass$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<MyDataClass>();
   }
 }
 
@@ -12987,55 +8213,14 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/annotations/MyDataClass;';
-
-  @jni$_.internal
-  @core$_.override
-  MyDataClass fromReference(jni$_.JReference reference) =>
-      MyDataClass.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<MyDataClass?> get nullableType =>
-      const $MyDataClass$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($MyDataClass$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($MyDataClass$Type$) &&
-        other is $MyDataClass$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.NotNull`
-class NotNull extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<NotNull> $type;
-
-  @jni$_.internal
-  NotNull.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type NotNull._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/annotations/NotNull');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<NotNull?> nullableType = $NotNull$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<NotNull> type = $NotNull$Type$();
 
   /// Maps a specific port to the implemented interface.
@@ -13104,9 +8289,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return NotNull.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<NotNull>();
   }
 }
 
@@ -13118,43 +8301,6 @@
   _$NotNull();
 }
 
-final class $NotNull$NullableType$ extends jni$_.JType<NotNull?> {
-  @jni$_.internal
-  const $NotNull$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/annotations/NotNull;';
-
-  @jni$_.internal
-  @core$_.override
-  NotNull? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : NotNull.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<NotNull?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($NotNull$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($NotNull$NullableType$) &&
-        other is $NotNull$NullableType$;
-  }
-}
-
 final class $NotNull$Type$ extends jni$_.JType<NotNull> {
   @jni$_.internal
   const $NotNull$Type$();
@@ -13162,52 +8308,14 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/annotations/NotNull;';
-
-  @jni$_.internal
-  @core$_.override
-  NotNull fromReference(jni$_.JReference reference) => NotNull.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<NotNull?> get nullableType => const $NotNull$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($NotNull$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($NotNull$Type$) && other is $NotNull$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.annotations.Nullable`
-class Nullable extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<Nullable> $type;
-
-  @jni$_.internal
-  Nullable.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type Nullable._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/annotations/Nullable');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<Nullable?> nullableType = $Nullable$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<Nullable> type = $Nullable$Type$();
 
   /// Maps a specific port to the implemented interface.
@@ -13276,9 +8384,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return Nullable.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<Nullable>();
   }
 }
 
@@ -13290,43 +8396,6 @@
   _$Nullable();
 }
 
-final class $Nullable$NullableType$ extends jni$_.JType<Nullable?> {
-  @jni$_.internal
-  const $Nullable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/annotations/Nullable;';
-
-  @jni$_.internal
-  @core$_.override
-  Nullable? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : Nullable.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Nullable?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Nullable$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Nullable$NullableType$) &&
-        other is $Nullable$NullableType$;
-  }
-}
-
 final class $Nullable$Type$ extends jni$_.JType<Nullable> {
   @jni$_.internal
   const $Nullable$Type$();
@@ -13334,53 +8403,14 @@
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/annotations/Nullable;';
-
-  @jni$_.internal
-  @core$_.override
-  Nullable fromReference(jni$_.JReference reference) => Nullable.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<Nullable?> get nullableType => const $Nullable$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($Nullable$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($Nullable$Type$) && other is $Nullable$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.regressions.R2250$Child`
-class R2250$Child extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<R2250$Child> $type;
-
-  @jni$_.internal
-  R2250$Child.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(reference);
-
+extension type R2250$Child._(jni$_.JObject _$this) implements jni$_.JObject {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/regressions/R2250$Child');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<R2250$Child?> nullableType =
-      $R2250$Child$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<R2250$Child> type = $R2250$Child$Type$();
   static final _id_foo = _class.instanceMethodId(
     r'foo',
@@ -13439,7 +8469,7 @@
       final $a = $i.args;
       if ($d == r'foo(Ljava/lang/Object;)V') {
         _$impls[$p]!.foo(
-          $a![0]?.as(const jni$_.$JObject$Type$(), releaseOriginal: true),
+          $a![0],
         );
         return jni$_.nullptr;
       }
@@ -13481,9 +8511,7 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return R2250$Child.fromReference(
-      $i.implementReference(),
-    );
+    return $i.implement<R2250$Child>();
   }
 }
 
@@ -13511,44 +8539,6 @@
   }
 }
 
-final class $R2250$Child$NullableType$ extends jni$_.JType<R2250$Child?> {
-  @jni$_.internal
-  const $R2250$Child$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/regressions/R2250$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  R2250$Child? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : R2250$Child.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R2250$Child?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($R2250$Child$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R2250$Child$NullableType$) &&
-        other is $R2250$Child$NullableType$;
-  }
-}
-
 final class $R2250$Child$Type$ extends jni$_.JType<R2250$Child> {
   @jni$_.internal
   const $R2250$Child$Type$();
@@ -13557,73 +8547,16 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/regressions/R2250$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  R2250$Child fromReference(jni$_.JReference reference) =>
-      R2250$Child.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R2250$Child?> get nullableType =>
-      const $R2250$Child$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => ($R2250$Child$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R2250$Child$Type$) &&
-        other is $R2250$Child$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.regressions.R2250`
-class R2250<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<R2250<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  R2250.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type R2250<$T extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/regressions/R2250');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<R2250<$T>?> nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $R2250$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<R2250<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $R2250$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<R2250> type = $R2250$Type$();
   static final _id_foo = _class.instanceMethodId(
     r'foo',
     r'(Ljava/lang/Object;)V',
@@ -13681,7 +8614,7 @@
       final $a = $i.args;
       if ($d == r'foo(Ljava/lang/Object;)V') {
         _$impls[$p]!.foo(
-          $a![0]?.as(_$impls[$p]!.T, releaseOriginal: true),
+          $a![0],
         );
         return jni$_.nullptr;
       }
@@ -13723,36 +8656,26 @@
   ) {
     final $i = jni$_.JImplementer();
     implementIn($i, $impl);
-    return R2250<$T>.fromReference(
-      $impl.T,
-      $i.implementReference(),
-    );
+    return $i.implement<R2250<$T>>();
   }
 }
 
 abstract base mixin class $R2250<$T extends jni$_.JObject?> {
   factory $R2250({
-    required jni$_.JType<$T> T,
     required void Function($T? object) foo,
     bool foo$async,
   }) = _$R2250<$T>;
 
-  jni$_.JType<$T> get T;
-
   void foo($T? object);
   bool get foo$async => false;
 }
 
 final class _$R2250<$T extends jni$_.JObject?> with $R2250<$T> {
   _$R2250({
-    required this.T,
     required void Function($T? object) foo,
     this.foo$async = false,
   }) : _foo = foo;
 
-  @core$_.override
-  final jni$_.JType<$T> T;
-
   final void Function($T? object) _foo;
   final bool foo$async;
 
@@ -13761,115 +8684,21 @@
   }
 }
 
-final class $R2250$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<R2250<$T>?> {
+final class $R2250$Type$ extends jni$_.JType<R2250> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $R2250$NullableType$(
-    this.T,
-  );
+  const $R2250$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/regressions/R2250;';
-
-  @jni$_.internal
-  @core$_.override
-  R2250<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : R2250<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R2250<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($R2250$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R2250$NullableType$<$T>) &&
-        other is $R2250$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $R2250$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<R2250<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $R2250$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/regressions/R2250;';
-
-  @jni$_.internal
-  @core$_.override
-  R2250<$T> fromReference(jni$_.JReference reference) =>
-      R2250<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R2250<$T>?> get nullableType => $R2250$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($R2250$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R2250$Type$<$T>) &&
-        other is $R2250$Type$<$T> &&
-        T == other.T;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.regressions.R693$Child`
-class R693$Child extends R693<R693$Child?> {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<R693$Child> $type;
-
-  @jni$_.internal
-  R693$Child.fromReference(
-    jni$_.JReference reference,
-  )   : $type = type,
-        super.fromReference(const $R693$Child$NullableType$(), reference);
-
+extension type R693$Child._(jni$_.JObject _$this) implements R693<R693$Child?> {
   static final _class = jni$_.JClass.forName(
       r'com/github/dart_lang/jnigen/regressions/R693$Child');
 
   /// The type which includes information such as the signature of this class.
-  static const jni$_.JType<R693$Child?> nullableType =
-      $R693$Child$NullableType$();
-
-  /// The type which includes information such as the signature of this class.
   static const jni$_.JType<R693$Child> type = $R693$Child$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
@@ -13890,48 +8719,8 @@
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
   factory R693$Child() {
-    return R693$Child.fromReference(
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
-  }
-}
-
-final class $R693$Child$NullableType$ extends jni$_.JType<R693$Child?> {
-  @jni$_.internal
-  const $R693$Child$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  String get signature =>
-      r'Lcom/github/dart_lang/jnigen/regressions/R693$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  R693$Child? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : R693$Child.fromReference(
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType =>
-      const $R693$NullableType$<R693$Child?>($R693$Child$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R693$Child?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => ($R693$Child$NullableType$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R693$Child$NullableType$) &&
-        other is $R693$Child$NullableType$;
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<R693$Child>();
   }
 }
 
@@ -13943,74 +8732,16 @@
   @core$_.override
   String get signature =>
       r'Lcom/github/dart_lang/jnigen/regressions/R693$Child;';
-
-  @jni$_.internal
-  @core$_.override
-  R693$Child fromReference(jni$_.JReference reference) =>
-      R693$Child.fromReference(
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType =>
-      const $R693$NullableType$<R693$Child?>($R693$Child$NullableType$());
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R693$Child?> get nullableType =>
-      const $R693$Child$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 2;
-
-  @core$_.override
-  int get hashCode => ($R693$Child$Type$).hashCode;
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R693$Child$Type$) &&
-        other is $R693$Child$Type$;
-  }
 }
 
 /// from: `com.github.dart_lang.jnigen.regressions.R693`
-class R693<$T extends jni$_.JObject?> extends jni$_.JObject {
-  @jni$_.internal
-  @core$_.override
-  final jni$_.JType<R693<$T>> $type;
-
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  R693.fromReference(
-    this.T,
-    jni$_.JReference reference,
-  )   : $type = type<$T>(T),
-        super.fromReference(reference);
-
+extension type R693<$T extends jni$_.JObject?>._(jni$_.JObject _$this)
+    implements jni$_.JObject {
   static final _class =
       jni$_.JClass.forName(r'com/github/dart_lang/jnigen/regressions/R693');
 
   /// The type which includes information such as the signature of this class.
-  static jni$_.JType<R693<$T>?> nullableType<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $R693$NullableType$<$T>(
-      T,
-    );
-  }
-
-  /// The type which includes information such as the signature of this class.
-  static jni$_.JType<R693<$T>> type<$T extends jni$_.JObject?>(
-    jni$_.JType<$T> T,
-  ) {
-    return $R693$Type$<$T>(
-      T,
-    );
-  }
-
+  static const jni$_.JType<R693> type = $R693$Type$();
   static final _id_new$ = _class.constructorId(
     r'()V',
   );
@@ -14029,100 +8760,17 @@
 
   /// from: `public void <init>()`
   /// The returned object must be released after use, by calling the [release] method.
-  factory R693({
-    required jni$_.JType<$T> T,
-  }) {
-    return R693<$T>.fromReference(
-        T,
-        _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
-            .reference);
+  factory R693() {
+    return _new$(_class.reference.pointer, _id_new$ as jni$_.JMethodIDPtr)
+        .object<R693<$T>>();
   }
 }
 
-final class $R693$NullableType$<$T extends jni$_.JObject?>
-    extends jni$_.JType<R693<$T>?> {
+final class $R693$Type$ extends jni$_.JType<R693> {
   @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $R693$NullableType$(
-    this.T,
-  );
+  const $R693$Type$();
 
   @jni$_.internal
   @core$_.override
   String get signature => r'Lcom/github/dart_lang/jnigen/regressions/R693;';
-
-  @jni$_.internal
-  @core$_.override
-  R693<$T>? fromReference(jni$_.JReference reference) => reference.isNull
-      ? null
-      : R693<$T>.fromReference(
-          T,
-          reference,
-        );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R693<$T>?> get nullableType => this;
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($R693$NullableType$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R693$NullableType$<$T>) &&
-        other is $R693$NullableType$<$T> &&
-        T == other.T;
-  }
-}
-
-final class $R693$Type$<$T extends jni$_.JObject?>
-    extends jni$_.JType<R693<$T>> {
-  @jni$_.internal
-  final jni$_.JType<$T> T;
-
-  @jni$_.internal
-  const $R693$Type$(
-    this.T,
-  );
-
-  @jni$_.internal
-  @core$_.override
-  String get signature => r'Lcom/github/dart_lang/jnigen/regressions/R693;';
-
-  @jni$_.internal
-  @core$_.override
-  R693<$T> fromReference(jni$_.JReference reference) => R693<$T>.fromReference(
-        T,
-        reference,
-      );
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType get superType => const jni$_.$JObject$NullableType$();
-
-  @jni$_.internal
-  @core$_.override
-  jni$_.JType<R693<$T>?> get nullableType => $R693$NullableType$<$T>(T);
-
-  @jni$_.internal
-  @core$_.override
-  final superCount = 1;
-
-  @core$_.override
-  int get hashCode => Object.hash($R693$Type$, T);
-
-  @core$_.override
-  bool operator ==(Object other) {
-    return other.runtimeType == ($R693$Type$<$T>) &&
-        other is $R693$Type$<$T> &&
-        T == other.T;
-  }
 }
diff --git a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart
index 1635071..e226887 100644
--- a/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart
+++ b/pkgs/jnigen/test/simple_package_test/runtime_test_registrant.dart
@@ -221,7 +221,7 @@
       final ex2 = Example();
       ex1.setNumber(1);
       ex2.setNumber(2);
-      final array = JArray(Example.nullableType, 2);
+      final array = JArray.withLength(Example.type, 2);
       array[0] = ex1;
       array[1] = ex2;
       expect(array[0]!.getNumber(), 1);
@@ -290,10 +290,7 @@
         using((arena) {
           final grandParent = GrandParent(
             'Hello'.toJString()..releasedBy(arena),
-            T: JString.type,
           )..releasedBy(arena);
-          expect(grandParent, isA<GrandParent<JString>>());
-          expect(grandParent.$type, isA<$GrandParent$Type$<JString>>());
           expect(
             grandParent.value!.toDartString(releaseOriginal: true),
             'Hello',
@@ -302,38 +299,16 @@
       });
       test('MyStack<T>', () {
         using((arena) {
-          final stack = MyStack(T: JString.type)..releasedBy(arena);
+          final stack = MyStack<JString>()..releasedBy(arena);
           stack.push('Hello'.toJString()..releasedBy(arena));
           stack.push('World'.toJString()..releasedBy(arena));
           expect(stack.pop()!.toDartString(releaseOriginal: true), 'World');
           expect(stack.pop()!.toDartString(releaseOriginal: true), 'Hello');
         });
       });
-      test(
-        'Different stacks have different types, same stacks have same types',
-        () {
-          using((arena) {
-            final aStringStack = MyStack(T: JString.type)..releasedBy(arena);
-            final anotherStringStack = MyStack(T: JString.type)
-              ..releasedBy(arena);
-            final anObjectStack = MyStack(T: JObject.type)..releasedBy(arena);
-            expect(aStringStack.$type, anotherStringStack.$type);
-            expect(
-              aStringStack.$type.hashCode,
-              anotherStringStack.$type.hashCode,
-            );
-            expect(aStringStack.$type, isNot(anObjectStack.$type));
-            expect(
-              aStringStack.$type.hashCode,
-              isNot(anObjectStack.$type.hashCode),
-            );
-          });
-        },
-      );
       test('MyMap<K, V>', () {
         using((arena) {
-          final map = MyMap(K: JString.type, V: Example.type)
-            ..releasedBy(arena);
+          final map = MyMap<JString, Example>()..releasedBy(arena);
           final helloExample = Example.new$1(1)..releasedBy(arena);
           final worldExample = Example.new$1(2)..releasedBy(arena);
           map.put('Hello'.toJString()..releasedBy(arena), helloExample);
@@ -376,7 +351,7 @@
         });
         test('StringKeyedMap', () {
           using((arena) {
-            final map = StringKeyedMap(V: Example.type)..releasedBy(arena);
+            final map = StringKeyedMap<Example>()..releasedBy(arena);
             final example = Example()..releasedBy(arena);
             map.put('Hello'.toJString()..releasedBy(arena), example);
             expect(
@@ -391,7 +366,7 @@
         });
         test('StringValuedMap', () {
           using((arena) {
-            final map = StringValuedMap(K: Example.type)..releasedBy(arena);
+            final map = StringValuedMap<Example>()..releasedBy(arena);
             final example = Example()..releasedBy(arena);
             map.put(example, 'Hello'.toJString()..releasedBy(arena));
             expect(
@@ -416,22 +391,9 @@
           });
         });
       });
-      test('superclass count', () {
-        // ignore: invalid_use_of_internal_member
-        expect(JObject.type.superCount, 0);
-        // ignore: invalid_use_of_internal_member
-        expect(MyMap.type(JObject.type, JObject.type).superCount, 1);
-        // ignore: invalid_use_of_internal_member
-        expect(StringKeyedMap.type(JObject.type).superCount, 2);
-        // ignore: invalid_use_of_internal_member
-        expect(StringValuedMap.type(JObject.type).superCount, 2);
-        // ignore: invalid_use_of_internal_member
-        expect(StringMap.type.superCount, 3);
-      });
       test('nested generics', () {
         using((arena) {
-          final grandParent = GrandParent(
-            T: JString.type,
+          final grandParent = GrandParent<JString>(
             '!'.toJString()..releasedBy(arena),
           )..releasedBy(arena);
           expect(grandParent.value!.toDartString(releaseOriginal: true), '!');
@@ -444,7 +406,6 @@
           );
 
           final exampleStaticParent = GrandParent.varStaticParent(
-            S: Example.type,
             Example()..releasedBy(arena),
           )!
             ..releasedBy(arena);
@@ -463,7 +424,6 @@
           expect(strParent.value!.toDartString(releaseOriginal: true), 'Hello');
 
           final exampleParent = grandParent.varParent(
-            S: Example.type,
             Example()..releasedBy(arena),
           )!
             ..releasedBy(arena);
@@ -481,17 +441,14 @@
     });
     test('Constructing non-static nested classes', () {
       using((arena) {
-        final grandParent = GrandParent(1.toJInteger(), T: JInteger.type)
-          ..releasedBy(arena);
+        final grandParent = GrandParent(1.toJInteger())..releasedBy(arena);
         final parent = GrandParent$Parent(
           grandParent,
           2.toJInteger(),
-          S: JInteger.type,
         )..releasedBy(arena);
         final child = GrandParent$Parent$Child(
           parent,
           3.toJInteger(),
-          U: JInteger.type,
         )..releasedBy(arena);
         expect(grandParent.value!.intValue(releaseOriginal: true), 1);
         expect(parent.parentValue!.intValue(releaseOriginal: true), 1);
@@ -502,908 +459,809 @@
       });
     });
 
-    group('Generic type inference', () {
-      test('MyStack.of1', () {
-        using((arena) {
-          final emptyStack = MyStack(T: JString.type)..releasedBy(arena);
-          expect(emptyStack.size(), 0);
-          final stack = MyStack.of$1(
-            'Hello'.toJString()..releasedBy(arena),
-            T: JString.type,
-          )!
-            ..releasedBy(arena);
-          expect(stack, isA<MyStack<JString?>>());
-          expect(stack.$type, isA<$MyStack$Type$<JString?>>());
-          expect(stack.pop()!.toDartString(releaseOriginal: true), 'Hello');
-        });
-      });
-      test('MyStack.of 2 strings', () {
-        using((arena) {
-          final stack = MyStack.of$2(
-            'Hello'.toJString()..releasedBy(arena),
-            'World'.toJString()..releasedBy(arena),
-            T: JString.type,
-          )!
-            ..releasedBy(arena);
-          expect(stack, isA<MyStack<JString?>>());
-          expect(stack.$type, isA<$MyStack$Type$<JString?>>());
-          expect(stack.pop()!.toDartString(releaseOriginal: true), 'World');
-          expect(stack.pop()!.toDartString(releaseOriginal: true), 'Hello');
-        });
-      });
-      test('MyStack.of a string and an array', () {
-        using((arena) {
-          final array = JArray.filled(1, 'World'.toJString()..releasedBy(arena))
-            ..releasedBy(arena);
-          final stack = MyStack.of$2(
-            T: JObject.type,
-            'Hello'.toJString()..releasedBy(arena),
-            array,
-          )!
-            ..releasedBy(arena);
-          expect(stack, isA<MyStack<JObject?>>());
-          expect(stack.$type, isA<$MyStack$Type$<JObject?>>());
-          expect(
-            stack
-                .pop()!
-                .as(JArray.type(JString.type), releaseOriginal: true)[0]
-                .toDartString(releaseOriginal: true),
-            'World',
-          );
-          expect(
-            stack
-                .pop()!
-                .as(JString.type, releaseOriginal: true)
-                .toDartString(releaseOriginal: true),
-            'Hello',
-          );
-        });
-      });
-      test('MyStack.from array of string', () {
-        using((arena) {
-          final array = JArray.filled(1, 'Hello'.toJString()..releasedBy(arena))
-            ..releasedBy(arena);
-          final stack = MyStack.fromArray(T: JString.type, array)!
-            ..releasedBy(arena);
-          expect(stack, isA<MyStack<JString?>>());
-          expect(stack.$type, isA<$MyStack$Type$<JString?>>());
-          expect(stack.pop()!.toDartString(releaseOriginal: true), 'Hello');
-        });
-      });
-      test('MyStack.fromArrayOfArrayOfGrandParents', () {
-        using((arena) {
-          final firstDimention = JArray.filled(
-            1,
-            GrandParent(T: JString.type, 'Hello'.toJString()..releasedBy(arena))
-              ..releasedBy(arena),
-          )..releasedBy(arena);
-          final twoDimentionalArray = JArray.filled(1, firstDimention)
-            ..releasedBy(arena);
-          final stack = MyStack.fromArrayOfArrayOfGrandParents(
-            S: JString.type,
-            twoDimentionalArray,
-          )!
-            ..releasedBy(arena);
-          expect(stack, isA<MyStack<JString?>>());
-          expect(stack.$type, isA<$MyStack$Type$<JString?>>());
-          expect(stack.pop()!.toDartString(releaseOriginal: true), 'Hello');
-        });
-      });
-    });
-  });
-
-  group('interface implementation', () {
-    for (final (threading, consume) in [
-      ('another thread', MyInterfaceConsumer.consumeOnAnotherThread),
-      ('the same thread', MyInterfaceConsumer.consumeOnSameThread),
-    ]) {
-      test('MyInterface.implement on $threading', () async {
-        final voidCallbackResult = Completer<JString>();
-        final varCallbackResult = Completer<JInteger>();
-        final manyPrimitivesResult = Completer<int>();
-        // We can use this trick to access self, instead of generating a `thiz`
-        // or `self` argument for each one of the callbacks.
-        late final MyInterface<JInteger> myInterface;
-        myInterface = MyInterface.implement(
-          $MyInterface(
-            voidCallback: voidCallbackResult.complete,
-            stringCallback: (s) {
-              return (s!.toDartString(releaseOriginal: true) * 2).toJString();
-            },
-            varCallback: (JInteger? t) {
-              final result =
-                  (t!.intValue(releaseOriginal: true) * 2).toJInteger();
-              varCallbackResult.complete(result);
-              return result;
-            },
-            manyPrimitives: (a, b, c, d) {
-              if (b) {
-                final result = a + c + d.toInt();
-                manyPrimitivesResult.complete(result);
+    group('interface implementation', () {
+      for (final (threading, consume) in [
+        ('another thread', MyInterfaceConsumer.consumeOnAnotherThread),
+        ('the same thread', MyInterfaceConsumer.consumeOnSameThread),
+      ]) {
+        test('MyInterface.implement on $threading', () async {
+          final voidCallbackResult = Completer<JString>();
+          final varCallbackResult = Completer<JInteger>();
+          final manyPrimitivesResult = Completer<int>();
+          // We can use this trick to access self, instead of generating a `thiz`
+          // or `self` argument for each one of the callbacks.
+          late final MyInterface<JInteger> myInterface;
+          myInterface = MyInterface.implement(
+            $MyInterface(
+              voidCallback: voidCallbackResult.complete,
+              stringCallback: (s) {
+                return (s!.toDartString(releaseOriginal: true) * 2).toJString();
+              },
+              varCallback: (JInteger? t) {
+                final result =
+                    (t!.intValue(releaseOriginal: true) * 2).toJInteger();
+                varCallbackResult.complete(result);
                 return result;
-              } else {
-                // Call self, add to [a] when [b] is false and change b to true.
-                return myInterface.manyPrimitives(a + 1, true, c, d);
-              }
-            },
-            T: JInteger.type,
-          ),
-        );
-        // [stringCallback] is going to be called first using [s].
-        // The result of it is going to be used as the argument for
-        // [voidCallback].
-        // The other two methods will be called individually using the passed
-        // arguments afterwards.
-        consume(
-          T: JInteger.type,
-          myInterface,
-          // For stringCallback:
-          'hello'.toJString(),
-          // For manyPrimitives:
-          -1,
-          false,
-          3,
-          3.14,
-          // For varCallback
-          7.toJInteger(),
-        );
-        final voidCallback = await voidCallbackResult.future;
-        expect(voidCallback.toDartString(releaseOriginal: true), 'hellohello');
+              },
+              manyPrimitives: (a, b, c, d) {
+                if (b) {
+                  final result = a + c + d.toInt();
+                  manyPrimitivesResult.complete(result);
+                  return result;
+                } else {
+                  // Call self, add to [a] when [b] is false and change b to true.
+                  return myInterface.manyPrimitives(a + 1, true, c, d);
+                }
+              },
+            ),
+          );
+          // [stringCallback] is going to be called first using [s].
+          // The result of it is going to be used as the argument for
+          // [voidCallback].
+          // The other two methods will be called individually using the passed
+          // arguments afterwards.
+          consume(
+            myInterface,
+            // For stringCallback:
+            'hello'.toJString(),
+            // For manyPrimitives:
+            -1,
+            false,
+            3,
+            3.14,
+            // For varCallback
+            7.toJInteger(),
+          );
+          final voidCallback = await voidCallbackResult.future;
+          expect(
+              voidCallback.toDartString(releaseOriginal: true), 'hellohello');
 
-        final varCallback = await varCallbackResult.future;
-        expect(varCallback.intValue(), 14);
+          final varCallback = await varCallbackResult.future;
+          expect(varCallback.intValue(), 14);
 
-        final manyPrimitives = await manyPrimitivesResult.future;
-        expect(manyPrimitives, -1 + 3 + 3.14.toInt() + 1);
+          final manyPrimitives = await manyPrimitivesResult.future;
+          expect(manyPrimitives, -1 + 3 + 3.14.toInt() + 1);
 
-        // Running garbage collection does not work on Android. Skipping this
-        // test on Android.
-        // Currently we have one implementation of the interface.
-        expect(MyInterface.$impls, hasLength(1), skip: Platform.isAndroid);
-        myInterface.release();
-        if (!Platform.isAndroid) {
-          _runJavaGC();
-          await _waitUntil(() => MyInterface.$impls.isEmpty);
-          expect(MyInterface.$impls, isEmpty);
-        }
-      });
-      test('implementing multiple interfaces', () async {
-        final implementer = JImplementer();
-        MyInterface.implementIn(
-          implementer,
-          $MyInterface(
-            T: JString.type,
-            voidCallback: (s) {},
-            stringCallback: (s) {
-              return s;
-            },
-            varCallback: (t) {
-              return t;
-            },
-            manyPrimitives: (a, b, c, d) => 42,
-          ),
-        );
-        var runnableRan = false;
-        MyRunnable.implementIn(
-          implementer,
-          $MyRunnable(
-            run: () {
-              runnableRan = true;
-            },
-          ),
-        );
-        final runnable = implementer.implement(MyRunnable.type);
-        runnable.run();
-        expect(runnableRan, isTrue);
-        final myInterface = runnable.as(
-          MyInterface.type(JString.type),
-          releaseOriginal: true,
-        );
-        expect(myInterface.manyPrimitives(1, true, 3, 4), 42);
-
-        // Running garbage collection does not work on Android. Skipping this
-        // test on Android.
-        expect(MyInterface.$impls, hasLength(1), skip: Platform.isAndroid);
-        expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid);
-        myInterface.release();
-        if (!Platform.isAndroid) {
-          _runJavaGC();
-          await _waitUntil(() => MyInterface.$impls.isEmpty);
-          // Since the interface is now deleted, the cleaner must signal to Dart
-          // to clean up.
-          expect(MyInterface.$impls, isEmpty);
-          expect(MyRunnable.$impls, isEmpty);
-        }
-      });
-      test('Reuse implementation for multiple instances', () {
-        using((arena) {
-          final hexParser = StringConverter.implement(
-            DartStringToIntParser(radix: 16),
-          )..releasedBy(arena);
-          final decimalParser = StringConverter.implement(
-            DartStringToIntParser(radix: 10),
-          )..releasedBy(arena);
-          final fifteen = StringConverterConsumer.consumeOnSameThread(
-            hexParser,
-            'F'.toJString()..releasedBy(arena),
-          )!;
-          expect(fifteen.intValue(releaseOriginal: true), 15);
-          final fortyTwo = StringConverterConsumer.consumeOnSameThread(
-            decimalParser,
-            '42'.toJString()..releasedBy(arena),
-          )!;
-          expect(fortyTwo.intValue(releaseOriginal: true), 42);
-        });
-      });
-      for (final style in ['callback', 'implemented class']) {
-        test('Listener callbacks - $style style', () async {
-          final completer = Completer<void>();
-
-          final MyRunnable runnable;
-          if (style == 'callback') {
-            runnable = MyRunnable.implement(
-              $MyRunnable(run: completer.complete, run$async: true),
-            );
-          } else {
-            runnable = MyRunnable.implement(AsyncRunnable(completer));
+          // Running garbage collection does not work on Android. Skipping this
+          // test on Android.
+          // Currently we have one implementation of the interface.
+          expect(MyInterface.$impls, hasLength(1), skip: Platform.isAndroid);
+          myInterface.release();
+          if (!Platform.isAndroid) {
+            _runJavaGC();
+            await _waitUntil(() => MyInterface.$impls.isEmpty);
+            expect(MyInterface.$impls, isEmpty);
           }
-          final runner = MyRunnableRunner(runnable);
-          // Normally this would cause a deadlock, but as the callback is a
-          // listener, it will work.
-          runner.runOnAnotherThreadAndJoin();
-          await completer.future;
+        });
+        test('implementing multiple interfaces', () async {
+          final implementer = JImplementer();
+          MyInterface.implementIn(
+            implementer,
+            $MyInterface<JString>(
+              voidCallback: (s) {},
+              stringCallback: (s) {
+                return s;
+              },
+              varCallback: (t) {
+                return t;
+              },
+              manyPrimitives: (a, b, c, d) => 42,
+            ),
+          );
+          var runnableRan = false;
+          MyRunnable.implementIn(
+            implementer,
+            $MyRunnable(
+              run: () {
+                runnableRan = true;
+              },
+            ),
+          );
+          final runnable = implementer.implement<MyRunnable>();
+          runnable.run();
+          expect(runnableRan, isTrue);
+          final myInterface = runnable.as(
+            MyInterface.type(JString.type),
+            releaseOriginal: true,
+          );
+          expect(myInterface.manyPrimitives(1, true, 3, 4), 42);
+
+          // Running garbage collection does not work on Android. Skipping this
+          // test on Android.
+          expect(MyInterface.$impls, hasLength(1), skip: Platform.isAndroid);
+          expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid);
+          myInterface.release();
+          if (!Platform.isAndroid) {
+            _runJavaGC();
+            await _waitUntil(() => MyInterface.$impls.isEmpty);
+            // Since the interface is now deleted, the cleaner must signal to Dart
+            // to clean up.
+            expect(MyInterface.$impls, isEmpty);
+            expect(MyRunnable.$impls, isEmpty);
+          }
+        });
+        test('Reuse implementation for multiple instances', () {
+          using((arena) {
+            final hexParser = StringConverter.implement(
+              DartStringToIntParser(radix: 16),
+            )..releasedBy(arena);
+            final decimalParser = StringConverter.implement(
+              DartStringToIntParser(radix: 10),
+            )..releasedBy(arena);
+            final fifteen = StringConverterConsumer.consumeOnSameThread(
+              hexParser,
+              'F'.toJString()..releasedBy(arena),
+            )!;
+            expect(fifteen.intValue(releaseOriginal: true), 15);
+            final fortyTwo = StringConverterConsumer.consumeOnSameThread(
+              decimalParser,
+              '42'.toJString()..releasedBy(arena),
+            )!;
+            expect(fortyTwo.intValue(releaseOriginal: true), 42);
+          });
+        });
+        for (final style in ['callback', 'implemented class']) {
+          test('Listener callbacks - $style style', () async {
+            final completer = Completer<void>();
+
+            final MyRunnable runnable;
+            if (style == 'callback') {
+              runnable = MyRunnable.implement(
+                $MyRunnable(run: completer.complete, run$async: true),
+              );
+            } else {
+              runnable = MyRunnable.implement(AsyncRunnable(completer));
+            }
+            final runner = MyRunnableRunner(runnable);
+            // Normally this would cause a deadlock, but as the callback is a
+            // listener, it will work.
+            runner.runOnAnotherThreadAndJoin();
+            await completer.future;
+            // Running garbage collection does not work on Android. Skipping
+            // this test on Android.
+            expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid);
+            runnable.release();
+            runner.release();
+            if (!Platform.isAndroid) {
+              _runJavaGC();
+              await _waitUntil(() => MyInterface.$impls.isEmpty);
+              // Since the interface is now deleted, the cleaner must signal to
+              // Dart to clean up.
+              expect(MyRunnable.$impls, isEmpty);
+            }
+          });
+        }
+        test('Object methods work', () async {
+          final runnable = MyRunnable.implement($MyRunnable(run: () {}));
+          expect(runnable == runnable, true);
+          expect(runnable != runnable, false);
+          expect(runnable.hashCode, runnable.hashCode);
+          expect(runnable.toString(), runnable.toString());
           // Running garbage collection does not work on Android. Skipping
           // this test on Android.
           expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid);
           runnable.release();
-          runner.release();
           if (!Platform.isAndroid) {
             _runJavaGC();
             await _waitUntil(() => MyInterface.$impls.isEmpty);
-            // Since the interface is now deleted, the cleaner must signal to
-            // Dart to clean up.
             expect(MyRunnable.$impls, isEmpty);
           }
         });
       }
-      test('Object methods work', () async {
-        final runnable = MyRunnable.implement($MyRunnable(run: () {}));
-        expect(runnable == runnable, true);
-        expect(runnable != runnable, false);
-        expect(runnable.hashCode, runnable.hashCode);
-        expect(runnable.toString(), runnable.toString());
-        // Running garbage collection does not work on Android. Skipping
-        // this test on Android.
-        expect(MyRunnable.$impls, hasLength(1), skip: Platform.isAndroid);
-        runnable.release();
-        if (!Platform.isAndroid) {
-          _runJavaGC();
-          await _waitUntil(() => MyInterface.$impls.isEmpty);
-          expect(MyRunnable.$impls, isEmpty);
+      group('Dart exceptions are handled', () {
+        for (final exception in [UnimplementedError(), 'Hello!']) {
+          for (final sameThread in [true, false]) {
+            test(
+                'on ${sameThread ? 'the same thread' : 'another thread'}'
+                ' throwing $exception', () async {
+              await using((arena) async {
+                final runnable = MyRunnable.implement(
+                  $MyRunnable(
+                    run: () {
+                      // ignore: only_throw_errors
+                      throw exception;
+                    },
+                  ),
+                )..releasedBy(arena);
+                final runner = MyRunnableRunner(runnable)..releasedBy(arena);
+                if (sameThread) {
+                  runner.runOnSameThread();
+                } else {
+                  runner.runOnAnotherThread();
+                }
+                while (runner.error == null) {
+                  await Future<void>.delayed(const Duration(milliseconds: 100));
+                }
+                expect(
+                  runner.error!.isInstanceOf(
+                    JClass.forName(
+                      'java/lang/reflect/UndeclaredThrowableException',
+                    ),
+                  ),
+                  isTrue,
+                );
+                final throwableClass = runner.error!.jClass;
+                final cause = throwableClass
+                    .instanceMethodId('getCause', '()Ljava/lang/Throwable;')
+                    .call(runner.error!, JObject.type, []);
+                expect(
+                  cause.isInstanceOf(
+                    JClass.forName(
+                      'com/github/dart_lang/jni/PortProxyBuilder\$DartException',
+                    ),
+                  ),
+                  isTrue,
+                );
+                expect(cause.toString(), contains(exception.toString()));
+              });
+              if (!Platform.isAndroid) {
+                _runJavaGC();
+              }
+            });
+          }
         }
       });
-    }
-    group('Dart exceptions are handled', () {
-      for (final exception in [UnimplementedError(), 'Hello!']) {
-        for (final sameThread in [true, false]) {
-          test(
-              'on ${sameThread ? 'the same thread' : 'another thread'}'
-              ' throwing $exception', () async {
-            await using((arena) async {
-              final runnable = MyRunnable.implement(
-                $MyRunnable(
-                  run: () {
+
+      group('throw Java exceptions', () {
+        for (final (threading, consume) in [
+          ('another thread', StringConverterConsumer.consumeOnAnotherThread),
+          ('the same thread', StringConverterConsumer.consumeOnSameThread),
+        ]) {
+          test('StringConverter.implement on $threading ', () async {
+            final stringConverter = StringConverter.implement(
+              $StringConverter(
+                parseToInt: (s) {
+                  final value = int.tryParse(s!.toDartString());
+                  if (value == null) {
                     // ignore: only_throw_errors
-                    throw exception;
-                  },
+                    throw StringConversionException(
+                      'Invalid integer expression: $s'.toJString(),
+                    );
+                  }
+
+                  return value;
+                },
+              ),
+            );
+
+            // Gets the result of a Java Future.
+            // TODO(#1213): remove this once we support Java futures.
+            Future<$T> toDartFuture<$T extends JObject>(
+              JObject future,
+              JType<$T> T,
+            ) async {
+              final receivePort = ReceivePort();
+              await Isolate.spawn((sendPort) {
+                final futureClass =
+                    JClass.forName('java/util/concurrent/Future');
+                final getMethod = futureClass.instanceMethodId(
+                  'get',
+                  '()Ljava/lang/Object;',
+                );
+                final result = getMethod(future, T, []);
+                // A workaround for `--pause-isolates-on-exit`. Otherwise
+                // getting test with coverage pauses indefinitely here.
+                // https://github.com/dart-lang/coverage/issues/472
+                Isolate.current.kill();
+                sendPort.send(result);
+              }, receivePort.sendPort);
+              return (await receivePort.first) as $T;
+            }
+
+            final sevenHundredBoxed = consume(
+              stringConverter,
+              '700'.toJString(),
+            )!;
+            final int sevenHundred;
+            if (sevenHundredBoxed is JInteger) {
+              sevenHundred = sevenHundredBoxed.intValue();
+            } else {
+              sevenHundred = (await toDartFuture(
+                sevenHundredBoxed,
+                JInteger.type,
+              ))
+                  .intValue();
+            }
+            expect(sevenHundred, 700);
+
+            final fooBoxed = consume(stringConverter, 'foo'.toJString())!;
+            final int foo;
+            if (fooBoxed is JInteger) {
+              foo = fooBoxed.intValue();
+            } else {
+              foo = (await toDartFuture(fooBoxed, JInteger.type)).intValue();
+            }
+            expect(foo, -1);
+
+            stringConverter.release();
+          });
+        }
+      });
+      test('Generic interface', () {
+        using((arena) {
+          final genericInterface = GenericInterface.implement(
+            $GenericInterface(
+              arrayOf: (element) =>
+                  JArray(JString.nullableType, 1)..[0] = element!,
+              firstKeyOf: (map) => map!.keys.first!.as(JString.type),
+              firstValueOf: (map) => map!.values.first,
+              firstOfArray: (array) => array![0]!.as(JString.type),
+              firstOfGenericArray: (array) => array![0],
+              genericArrayOf: (element) =>
+                  JArray(JObject.nullableType, 1)..[0] = element,
+              mapOf: (key, value) =>
+                  JMap.hash(JString.type, JObject.type)..[key!] = value,
+            ),
+          )..releasedBy(arena);
+          final stringArray = genericInterface.arrayOf(
+            'hello'.toJString()..releasedBy(arena),
+          )!
+            ..releasedBy(arena);
+          expect(stringArray, hasLength(1));
+          expect(stringArray[0]!.toDartString(releaseOriginal: true), 'hello');
+          expect(
+            genericInterface
+                .firstOfArray(stringArray)!
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+
+          final intArray = genericInterface.genericArrayOf(
+            42.toJInteger()..releasedBy(arena),
+          )!
+            ..releasedBy(arena);
+          expect(
+            genericInterface
+                .firstOfGenericArray(intArray)!
+                .intValue(releaseOriginal: true),
+            42,
+          );
+
+          final jmap = genericInterface.mapOf(
+            'hello'.toJString()..releasedBy(arena),
+            42.toJInteger()..releasedBy(arena),
+          )!
+            ..releasedBy(arena);
+          expect(
+            jmap['hello'.toJString()..releasedBy(arena)]!.intValue(
+              releaseOriginal: true,
+            ),
+            42,
+          );
+          expect(
+            genericInterface
+                .firstKeyOf(jmap)!
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            genericInterface
+                .firstValueOf(jmap)!
+                .intValue(releaseOriginal: true),
+            42,
+          );
+        });
+      });
+      test('Superinterface methods are available', () {
+        expect(
+          $R2250.new,
+          isA<
+              $R2250<$T> Function<$T extends JObject?>({
+                required JType<$T> T,
+                required void Function($T?) foo,
+                bool foo$async,
+              })>(),
+        );
+        expect(
+          $R2250$Child.new,
+          isA<
+              $R2250$Child Function({
+                required void Function(JObject?) foo,
+                bool foo$async,
+              })>(),
+        );
+      });
+    });
+
+    group('Nullablity annotations', () {
+      Annotated<JString?, JString, JString> newTestObject(Arena arena) {
+        return Annotated(
+          null,
+          'hello'.toJString()..releasedBy(arena),
+          'world'.toJString()..releasedBy(arena),
+        )..releasedBy(arena);
+      }
+
+      Annotated<JString, JString, JString> newNonNullTestObject(Arena arena) {
+        return Annotated(
+          'hello'.toJString()..releasedBy(arena),
+          'hello'.toJString()..releasedBy(arena),
+          'world'.toJString()..releasedBy(arena),
+        )..releasedBy(arena);
+      }
+
+      test('Field access', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          expect(annotated.t, isNull);
+          expect(annotated.u.toDartString(releaseOriginal: true), 'hello');
+          expect(annotated.w.toDartString(releaseOriginal: true), 'world');
+        });
+      });
+
+      test('Field setting', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          annotated.t = 'hello'.toJString()..releasedBy(arena);
+          expect(
+            annotated.t!
+                .as(JString.type, releaseOriginal: true)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+        });
+      });
+
+      test('Static methods', () {
+        expect(
+          Annotated.staticHello().toDartString(releaseOriginal: true),
+          'hello',
+        );
+      });
+
+      test('Methods with no object args', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          expect(
+              annotated.hello().toDartString(releaseOriginal: true), 'hello');
+          expect(annotated.nullableHello(true), isNull);
+          expect(
+            annotated.nullableHello(false)!.toDartString(releaseOriginal: true),
+            'hello',
+          );
+        });
+      });
+
+      test('Methods returning arrays', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          expect(
+            (annotated.array()..releasedBy(arena))[0].toDartString(
+              releaseOriginal: true,
+            ),
+            'hello',
+          );
+          expect((annotated.arrayOfNullable()..releasedBy(arena))[0], isNull);
+          expect(annotated.nullableArray(true), isNull);
+          expect(
+            (annotated.nullableArray(
+              false,
+            )!
+                  ..releasedBy(arena))[0]
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(annotated.nullableArrayOfNullable(true), isNull);
+          expect(
+            (annotated.nullableArrayOfNullable(false)!..releasedBy(arena))[0],
+            isNull,
+          );
+        });
+      });
+
+      test('Methods returning lists', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          expect(
+            (annotated.list()..releasedBy(arena))[0].toDartString(
+              releaseOriginal: true,
+            ),
+            'hello',
+          );
+          expect((annotated.listOfNullable()..releasedBy(arena))[0], isNull);
+          expect(annotated.nullableList(true), isNull);
+          expect(
+            (annotated.nullableList(
+              false,
+            )!
+                  ..releasedBy(arena))[0]
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(annotated.nullableListOfNullable(true), isNull);
+          expect(
+            (annotated.nullableListOfNullable(false)!..releasedBy(arena))[0],
+            isNull,
+          );
+        });
+      });
+
+      test('Methods with one object arg', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          final object = 'hello'.toJString()..releasedBy(arena);
+          expect(
+            annotated.echo(object).toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated.nullableEcho(object)!.toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(annotated.nullableEcho(null), isNull);
+        });
+      });
+
+      test('Class generic methods with one object arg', () {
+        using((arena) {
+          final annotatedNullableT = newTestObject(arena);
+          final object = 'hello'.toJString()..releasedBy(arena);
+          expect(
+            annotatedNullableT
+                .classGenericEcho(object)! // Cannot make it non-nullable.
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotatedNullableT
+                .nullableClassGenericEcho(object)!
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(annotatedNullableT.nullableClassGenericEcho(null), isNull);
+
+          final annotatedNonNullableT = newNonNullTestObject(arena);
+          expect(
+            annotatedNonNullableT
+                .classGenericEcho(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotatedNonNullableT
+                .nullableClassGenericEcho(object)!
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(annotatedNonNullableT.nullableClassGenericEcho(null), isNull);
+        });
+      });
+
+      test('Method generic methods with one object arg', () {
+        using((arena) {
+          final annotated = newTestObject(arena);
+          final object = 'hello'.toJString()..releasedBy(arena);
+          expect(
+            annotated
+                .methodGenericEcho(object)
+                // Cannot make it non-nullable.
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                .methodGenericEcho(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                .methodGenericEcho2(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                .methodGenericEcho3(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                // Requires `V`.
+                .nullableReturnMethodGenericEcho(object, false)!
+                // Cannot make it non-nullable.
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                // Requires `V`.
+                .nullableReturnMethodGenericEcho(object, true),
+            isNull,
+          );
+          expect(
+            annotated
+                // `V` is optional.
+                .nullableReturnMethodGenericEcho2(object, false)!
+                // Cannot make it non-nullable.
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                // `V` is optional.
+                .nullableReturnMethodGenericEcho2(object, true),
+            isNull,
+          );
+          expect(
+            annotated.nullableMethodGenericEcho(null),
+            isNull,
+          );
+          expect(
+            annotated
+                .nullableMethodGenericEcho(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                .nullableMethodGenericEcho(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated.noAnnotationMethodGenericEcho(null),
+            isNull,
+          );
+          expect(
+            annotated
+                .noAnnotationMethodGenericEcho(object)!
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                // With no annotations, specifying a non-nullable type still
+                // requires `!`.
+                .noAnnotationMethodGenericEcho(object)!
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            annotated
+                .nullableArgMethodGenericEcho(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(
+            () => annotated.nullableArgMethodGenericEcho<JString>(null),
+            throwsA(isA<JniException>()),
+          );
+          expect(
+            annotated
+                .nullableArgMethodGenericEcho<JString>(object)
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+        });
+      });
+
+      test('Class generic list methods', () {
+        using((arena) {
+          final annotated = newNonNullTestObject(arena);
+          expect(
+            (annotated.classGenericList()..releasedBy(arena))
+                .first
+                .toDartString(
+                  releaseOriginal: true,
                 ),
-              )..releasedBy(arena);
-              final runner = MyRunnableRunner(runnable)..releasedBy(arena);
-              if (sameThread) {
-                runner.runOnSameThread();
-              } else {
-                runner.runOnAnotherThread();
-              }
-              while (runner.error == null) {
-                await Future<void>.delayed(const Duration(milliseconds: 100));
-              }
-              expect(
-                runner.error!.isInstanceOf(
-                  JClass.forName(
-                    'java/lang/reflect/UndeclaredThrowableException',
-                  ),
-                ),
-                isTrue,
-              );
-              final throwableClass = runner.error!.jClass;
-              final cause = throwableClass
-                  .instanceMethodId('getCause', '()Ljava/lang/Throwable;')
-                  .call(runner.error!, JObject.type, []);
-              expect(
-                cause.isInstanceOf(
-                  JClass.forName(
-                    'com/github/dart_lang/jni/PortProxyBuilder\$DartException',
-                  ),
-                ),
-                isTrue,
-              );
-              expect(cause.toString(), contains(exception.toString()));
-            });
-            if (!Platform.isAndroid) {
-              _runJavaGC();
+            'hello',
+          );
+          expect(
+            (annotated.classGenericListOfNullable()..releasedBy(arena)).first,
+            isNull,
+          );
+          expect(annotated.nullableClassGenericList(true), isNull);
+          expect(
+            (annotated.nullableClassGenericList(
+              false,
+            )!
+                  ..releasedBy(arena))
+                .first
+                .toDartString(releaseOriginal: true),
+            'hello',
+          );
+          expect(annotated.nullableClassGenericListOfNullable(true), isNull);
+          expect(
+            (annotated.nullableClassGenericListOfNullable(
+              false,
+            )!
+                  ..releasedBy(arena))
+                .first,
+            isNull,
+          );
+        });
+      });
+    });
+
+    group('Enums', () {
+      test('Color', () {
+        using((arena) {
+          final red = Colors.red..releasedBy(arena);
+          final green = Colors.green..releasedBy(arena);
+          final blue = Colors.blue..releasedBy(arena);
+          expect(red.code, 0xFF0000);
+          expect(green.code, 0x00FF00);
+          expect(blue.code, 0x0000FF);
+          expect(
+            red.toRGB()!..releasedBy(arena),
+            Colors$RGB(255, 0, 0)..releasedBy(arena),
+          );
+          expect(
+            green.toRGB()!..releasedBy(arena),
+            Colors$RGB(0, 255, 0)..releasedBy(arena),
+          );
+          expect(
+            blue.toRGB()!..releasedBy(arena),
+            Colors$RGB(0, 0, 255)..releasedBy(arena),
+          );
+        });
+      });
+    });
+
+    group('$groupName (load tests)', () {
+      const k4 = 4 * 1024; // This is a round number, unlike say 4000
+      const k256 = 256 * 1024;
+      test('Create large number of JNI references without deleting', () {
+        for (var i = 0; i < k4; i++) {
+          final e = Example.new$1(i);
+          expect(e.getNumber(), equals(i));
+        }
+      });
+      test('Create many JNI refs with scoped deletion', () {
+        for (var i = 0; i < k256; i++) {
+          using((arena) {
+            final e = Example.new$1(i)..releasedBy(arena);
+            expect(e.getNumber(), equals(i));
+          });
+        }
+      });
+      test('Create many JNI refs with scoped deletion, in batches', () {
+        for (var i = 0; i < 256; i++) {
+          using((arena) {
+            for (var i = 0; i < 1024; i++) {
+              final e = Example.new$1(i)..releasedBy(arena);
+              expect(e.getNumber(), equals(i));
             }
           });
         }
-      }
-    });
-
-    group('throw Java exceptions', () {
-      for (final (threading, consume) in [
-        ('another thread', StringConverterConsumer.consumeOnAnotherThread),
-        ('the same thread', StringConverterConsumer.consumeOnSameThread),
-      ]) {
-        test('StringConverter.implement on $threading ', () async {
-          final stringConverter = StringConverter.implement(
-            $StringConverter(
-              parseToInt: (s) {
-                final value = int.tryParse(s!.toDartString());
-                if (value == null) {
-                  // ignore: only_throw_errors
-                  throw StringConversionException(
-                    'Invalid integer expression: $s'.toJString(),
-                  );
-                }
-
-                return value;
-              },
-            ),
-          );
-
-          // Gets the result of a Java Future.
-          // TODO(#1213): remove this once we support Java futures.
-          Future<$T> toDartFuture<$T extends JObject>(
-            JObject future,
-            JType<$T> T,
-          ) async {
-            final receivePort = ReceivePort();
-            await Isolate.spawn((sendPort) {
-              final futureClass = JClass.forName('java/util/concurrent/Future');
-              final getMethod = futureClass.instanceMethodId(
-                'get',
-                '()Ljava/lang/Object;',
-              );
-              final result = getMethod(future, T, []);
-              // A workaround for `--pause-isolates-on-exit`. Otherwise getting
-              // test with coverage pauses indefinitely here.
-              // https://github.com/dart-lang/coverage/issues/472
-              Isolate.current.kill();
-              sendPort.send(result);
-            }, receivePort.sendPort);
-            return (await receivePort.first) as $T;
-          }
-
-          final sevenHundredBoxed = consume(
-            stringConverter,
-            '700'.toJString(),
-          )!;
-          final int sevenHundred;
-          if (sevenHundredBoxed is JInteger) {
-            sevenHundred = sevenHundredBoxed.intValue();
-          } else {
-            sevenHundred = (await toDartFuture(
-              sevenHundredBoxed,
-              JInteger.type,
-            ))
-                .intValue();
-          }
-          expect(sevenHundred, 700);
-
-          final fooBoxed = consume(stringConverter, 'foo'.toJString())!;
-          final int foo;
-          if (fooBoxed is JInteger) {
-            foo = fooBoxed.intValue();
-          } else {
-            foo = (await toDartFuture(fooBoxed, JInteger.type)).intValue();
-          }
-          expect(foo, -1);
-
-          stringConverter.release();
-        });
-      }
-    });
-    test('Generic interface', () {
-      using((arena) {
-        final genericInterface = GenericInterface.implement(
-          $GenericInterface(
-            T: JString.type,
-            arrayOf: (element) =>
-                JArray(JString.nullableType, 1)..[0] = element!,
-            firstKeyOf: (map) => map!.keys.first!.as(JString.type),
-            firstValueOf: (map) => map!.values.first,
-            firstOfArray: (array) => array![0]!.as(JString.type),
-            firstOfGenericArray: (array) => array![0],
-            genericArrayOf: (element) =>
-                JArray(JObject.nullableType, 1)..[0] = element,
-            mapOf: (key, value) =>
-                JMap.hash(JString.type, JObject.type)..[key!] = value,
-          ),
-        )..releasedBy(arena);
-        final stringArray = genericInterface.arrayOf(
-          'hello'.toJString()..releasedBy(arena),
-        )!
-          ..releasedBy(arena);
-        expect(stringArray, hasLength(1));
-        expect(stringArray[0]!.toDartString(releaseOriginal: true), 'hello');
-        expect(
-          genericInterface
-              .firstOfArray(stringArray)!
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-
-        final intArray = genericInterface.genericArrayOf(
-          U: JInteger.type,
-          42.toJInteger()..releasedBy(arena),
-        )!
-          ..releasedBy(arena);
-        expect(
-          genericInterface
-              .firstOfGenericArray(U: JInteger.type, intArray)!
-              .intValue(releaseOriginal: true),
-          42,
-        );
-
-        final jmap = genericInterface.mapOf(
-          U: JInteger.type,
-          'hello'.toJString()..releasedBy(arena),
-          42.toJInteger()..releasedBy(arena),
-        )!
-          ..releasedBy(arena);
-        expect(
-          jmap['hello'.toJString()..releasedBy(arena)]!.intValue(
-            releaseOriginal: true,
-          ),
-          42,
-        );
-        expect(
-          genericInterface
-              .firstKeyOf(U: JInteger.type, jmap)!
-              .as(JString.type)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          genericInterface
-              .firstValueOf(U: JInteger.type, jmap)!
-              .intValue(releaseOriginal: true),
-          42,
-        );
       });
-    });
-    test('Superinterface methods are available', () {
-      expect(
-        $R2250.new,
-        isA<
-            $R2250<$T> Function<$T extends JObject?>({
-              required JType<$T> T,
-              required void Function($T?) foo,
-              bool foo$async,
-            })>(),
-      );
-      expect(
-        $R2250$Child.new,
-        isA<
-            $R2250$Child Function({
-              required void Function(JObject?) foo,
-              bool foo$async,
-            })>(),
-      );
-    });
-  });
-
-  group('Nullablity annotations', () {
-    Annotated<JString?, JString, JString> newTestObject(Arena arena) {
-      return Annotated(
-        null,
-        'hello'.toJString()..releasedBy(arena),
-        'world'.toJString()..releasedBy(arena),
-        T: JString.nullableType,
-      )..releasedBy(arena);
-    }
-
-    Annotated<JString, JString, JString> newNonNullTestObject(Arena arena) {
-      return Annotated(
-        'hello'.toJString()..releasedBy(arena),
-        'hello'.toJString()..releasedBy(arena),
-        'world'.toJString()..releasedBy(arena),
-        T: JString.type,
-      )..releasedBy(arena);
-    }
-
-    test('Field access', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        expect(annotated.t, isNull);
-        expect(annotated.u.toDartString(releaseOriginal: true), 'hello');
-        expect(annotated.w.toDartString(releaseOriginal: true), 'world');
-      });
-    });
-
-    test('Field setting', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        annotated.t = 'hello'.toJString()..releasedBy(arena);
-        expect(
-          annotated.t!
-              .as(JString.type, releaseOriginal: true)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-      });
-    });
-
-    test('Static methods', () {
-      expect(
-        Annotated.staticHello().toDartString(releaseOriginal: true),
-        'hello',
-      );
-    });
-
-    test('Methods with no object args', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        expect(annotated.hello().toDartString(releaseOriginal: true), 'hello');
-        expect(annotated.nullableHello(true), isNull);
-        expect(
-          annotated.nullableHello(false)!.toDartString(releaseOriginal: true),
-          'hello',
-        );
-      });
-    });
-
-    test('Methods returning arrays', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        expect(
-          (annotated.array()..releasedBy(arena))[0].toDartString(
-            releaseOriginal: true,
-          ),
-          'hello',
-        );
-        expect((annotated.arrayOfNullable()..releasedBy(arena))[0], isNull);
-        expect(annotated.nullableArray(true), isNull);
-        expect(
-          (annotated.nullableArray(
-            false,
-          )!
-                ..releasedBy(arena))[0]
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(annotated.nullableArrayOfNullable(true), isNull);
-        expect(
-          (annotated.nullableArrayOfNullable(false)!..releasedBy(arena))[0],
-          isNull,
-        );
-      });
-    });
-
-    test('Methods returning lists', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        expect(
-          (annotated.list()..releasedBy(arena))[0].toDartString(
-            releaseOriginal: true,
-          ),
-          'hello',
-        );
-        expect((annotated.listOfNullable()..releasedBy(arena))[0], isNull);
-        expect(annotated.nullableList(true), isNull);
-        expect(
-          (annotated.nullableList(
-            false,
-          )!
-                ..releasedBy(arena))[0]
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(annotated.nullableListOfNullable(true), isNull);
-        expect(
-          (annotated.nullableListOfNullable(false)!..releasedBy(arena))[0],
-          isNull,
-        );
-      });
-    });
-
-    test('Methods with one object arg', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        final object = 'hello'.toJString()..releasedBy(arena);
-        expect(
-          annotated.echo(object).toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated.nullableEcho(object)!.toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(annotated.nullableEcho(null), isNull);
-      });
-    });
-
-    test('Class generic methods with one object arg', () {
-      using((arena) {
-        final annotatedNullableT = newTestObject(arena);
-        final object = 'hello'.toJString()..releasedBy(arena);
-        expect(
-          annotatedNullableT
-              .classGenericEcho(object)! // Cannot make it non-nullable.
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotatedNullableT
-              .nullableClassGenericEcho(object)!
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(annotatedNullableT.nullableClassGenericEcho(null), isNull);
-
-        final annotatedNonNullableT = newNonNullTestObject(arena);
-        expect(
-          annotatedNonNullableT
-              .classGenericEcho(object)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotatedNonNullableT
-              .nullableClassGenericEcho(object)!
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(annotatedNonNullableT.nullableClassGenericEcho(null), isNull);
-      });
-    });
-
-    test('Method generic methods with one object arg', () {
-      using((arena) {
-        final annotated = newTestObject(arena);
-        final object = 'hello'.toJString()..releasedBy(arena);
-        expect(
-          annotated
-              .methodGenericEcho(object, V: JString.nullableType)!
-              // Cannot make it non-nullable.
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              .methodGenericEcho(object, V: JString.type)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              .methodGenericEcho2(object)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              .methodGenericEcho3(object)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              // Requires `V`.
-              .nullableReturnMethodGenericEcho(object, false, V: JString.type)!
-              // Cannot make it non-nullable.
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              // Requires `V`.
-              .nullableReturnMethodGenericEcho(object, true, V: JString.type),
-          isNull,
-        );
-        expect(
-          annotated
-              // `V` is optional.
-              .nullableReturnMethodGenericEcho2(object, false)!
-              // Cannot make it non-nullable.
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              // `V` is optional.
-              .nullableReturnMethodGenericEcho2(object, true),
-          isNull,
-        );
-        expect(
-          annotated.nullableMethodGenericEcho(null, V: JString.nullableType),
-          isNull,
-        );
-        expect(
-          annotated
-              .nullableMethodGenericEcho(object, V: JString.nullableType)!
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              .nullableMethodGenericEcho(object, V: JString.type)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated.noAnnotationMethodGenericEcho(
-            null,
-            V: JString.nullableType,
-          ),
-          isNull,
-        );
-        expect(
-          annotated
-              .noAnnotationMethodGenericEcho(object, V: JString.nullableType)!
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              // With no annotations, specifying a non-nullable type still
-              // requires `!`.
-              .noAnnotationMethodGenericEcho(object, V: JString.type)!
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          annotated
-              .nullableArgMethodGenericEcho(object, V: JString.type)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(
-          () => annotated.nullableArgMethodGenericEcho<JString>(
-            null,
-            V: JString.type,
-          ),
-          throwsA(isA<JniException>()),
-        );
-        expect(
-          annotated
-              .nullableArgMethodGenericEcho<JString>(object, V: JString.type)
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-      });
-    });
-
-    test('Class generic list methods', () {
-      using((arena) {
-        final annotated = newNonNullTestObject(arena);
-        expect(
-          (annotated.classGenericList()..releasedBy(arena)).first.toDartString(
-                releaseOriginal: true,
-              ),
-          'hello',
-        );
-        expect(
-          (annotated.classGenericListOfNullable()..releasedBy(arena)).first,
-          isNull,
-        );
-        expect(annotated.nullableClassGenericList(true), isNull);
-        expect(
-          (annotated.nullableClassGenericList(
-            false,
-          )!
-                ..releasedBy(arena))
-              .first
-              .toDartString(releaseOriginal: true),
-          'hello',
-        );
-        expect(annotated.nullableClassGenericListOfNullable(true), isNull);
-        expect(
-          (annotated.nullableClassGenericListOfNullable(
-            false,
-          )!
-                ..releasedBy(arena))
-              .first,
-          isNull,
-        );
-      });
-    });
-  });
-
-  group('Enums', () {
-    test('Color', () {
-      using((arena) {
-        final red = Colors.red..releasedBy(arena);
-        final green = Colors.green..releasedBy(arena);
-        final blue = Colors.blue..releasedBy(arena);
-        expect(red.code, 0xFF0000);
-        expect(green.code, 0x00FF00);
-        expect(blue.code, 0x0000FF);
-        expect(
-          red.toRGB()!..releasedBy(arena),
-          Colors$RGB(255, 0, 0)..releasedBy(arena),
-        );
-        expect(
-          green.toRGB()!..releasedBy(arena),
-          Colors$RGB(0, 255, 0)..releasedBy(arena),
-        );
-        expect(
-          blue.toRGB()!..releasedBy(arena),
-          Colors$RGB(0, 0, 255)..releasedBy(arena),
-        );
-      });
-    });
-  });
-
-  group('$groupName (load tests)', () {
-    const k4 = 4 * 1024; // This is a round number, unlike say 4000
-    const k256 = 256 * 1024;
-    test('Create large number of JNI references without deleting', () {
-      for (var i = 0; i < k4; i++) {
-        final e = Example.new$1(i);
-        expect(e.getNumber(), equals(i));
-      }
-    });
-    test('Create many JNI refs with scoped deletion', () {
-      for (var i = 0; i < k256; i++) {
-        using((arena) {
-          final e = Example.new$1(i)..releasedBy(arena);
-          expect(e.getNumber(), equals(i));
-        });
-      }
-    });
-    test('Create many JNI refs with scoped deletion, in batches', () {
-      for (var i = 0; i < 256; i++) {
-        using((arena) {
-          for (var i = 0; i < 1024; i++) {
-            final e = Example.new$1(i)..releasedBy(arena);
-            expect(e.getNumber(), equals(i));
-          }
-        });
-      }
-    });
-    test('Create large number of JNI refs with manual delete', () {
-      for (var i = 0; i < k256; i++) {
-        final e = Example.new$1(i);
-        expect(e.getNumber(), equals(i));
-        e.release();
-      }
-    });
-    test('Method returning primitive type does not create references', () {
-      using((arena) {
-        final e = Example.new$1(64)..releasedBy(arena);
+      test('Create large number of JNI refs with manual delete', () {
         for (var i = 0; i < k256; i++) {
-          expect(e.getNumber(), equals(64));
+          final e = Example.new$1(i);
+          expect(e.getNumber(), equals(i));
+          e.release();
         }
       });
-    });
-    test('Class references are cached', () {
-      final asterisk = '*'.codeUnitAt(0);
-      for (var i = 0; i < k256; i++) {
-        expect(Fields.asterisk, equals(asterisk));
+      test('Method returning primitive type does not create references', () {
+        using((arena) {
+          final e = Example.new$1(64)..releasedBy(arena);
+          for (var i = 0; i < k256; i++) {
+            expect(e.getNumber(), equals(64));
+          }
+        });
+      });
+      test('Class references are cached', () {
+        final asterisk = '*'.codeUnitAt(0);
+        for (var i = 0; i < k256; i++) {
+          expect(Fields.asterisk, equals(asterisk));
+        }
+      });
+      void testPassageOfTime(int n) {
+        test('Refs are not inadvertently deleted after $n seconds', () {
+          final f = Fields();
+          expect(f.trillion, equals(trillion));
+          sleep(Duration(seconds: n));
+          expect(f.trillion, equals(trillion));
+        });
+      }
+
+      if (!Platform.isAndroid) {
+        testPassageOfTime(1);
+        testPassageOfTime(4);
       }
     });
-    void testPassageOfTime(int n) {
-      test('Refs are not inadvertently deleted after $n seconds', () {
-        final f = Fields();
-        expect(f.trillion, equals(trillion));
-        sleep(Duration(seconds: n));
-        expect(f.trillion, equals(trillion));
-      });
-    }
-
-    if (!Platform.isAndroid) {
-      testPassageOfTime(1);
-      testPassageOfTime(4);
-    }
   });
 }