@@ -961,6 +961,10 @@ default <T> int getExtensionCount(GeneratedExtension<MessageT, List<T>> extensio
961961 /** Get the value of an extension. */
962962 <T > T getExtension (ExtensionLite <? extends MessageT , T > extension );
963963
964+ /** Get the value of a message-typed extension, or null if it is not set. */
965+ <T extends MessageLite > T getMessageTypedExtensionOrNull (
966+ ExtensionLite <? extends MessageT , T > extension );
967+
964968 /** Overload to maintain ABI compatibility. See {@link #getExtension(ExtensionLite)}. */
965969 default <T > T getExtension (Extension <? extends MessageT , T > extension ) {
966970 return getExtension ((ExtensionLite <? extends MessageT , T >) extension );
@@ -1098,6 +1102,21 @@ public final <T> T getExtension(final ExtensionLite<? extends MessageT, T> exten
10981102 return (T ) extension .fromReflectionType (value );
10991103 }
11001104
1105+ @ Override
1106+ @ SuppressWarnings ("unchecked" ) // Safe as fromReflectionType will always match the type of T.
1107+ public final <T extends MessageLite > T getMessageTypedExtensionOrNull (
1108+ final ExtensionLite <? extends MessageT , T > extensionLite ) {
1109+ Extension <MessageT , T > extension = checkNotLite (extensionLite );
1110+
1111+ final FieldDescriptor descriptor = extension .getDescriptor ();
1112+ verifyExtensionContainingType (descriptor );
1113+ final Object value = extensions .getField (descriptor );
1114+ if (value == null ) {
1115+ return null ;
1116+ }
1117+ return (T ) extension .fromReflectionType (value );
1118+ }
1119+
11011120 /** Get one element of a repeated extension. */
11021121 @ Override
11031122 @ SuppressWarnings ("unchecked" )
@@ -1484,6 +1503,22 @@ public final <T> T getExtension(final ExtensionLite<? extends MessageT, T> exten
14841503 return (T ) extension .fromReflectionType (value );
14851504 }
14861505
1506+ @ Override
1507+ @ SuppressWarnings ("unchecked" ) // Safe as fromReflectionType will always match the type of T.
1508+ public final <T extends MessageLite > T getMessageTypedExtensionOrNull (
1509+ final ExtensionLite <? extends MessageT , T > extensionLite ) {
1510+ Extension <MessageT , T > extension = checkNotLite (extensionLite );
1511+ verifyExtensionContainingType (extension );
1512+ if (extensions == null ) {
1513+ return null ;
1514+ }
1515+ final Object value = extensions .getField (extension .getDescriptor ());
1516+ if (value == null ) {
1517+ return null ;
1518+ }
1519+ return (T ) extension .fromReflectionType (value );
1520+ }
1521+
14871522 /** Get one element of a repeated extension. */
14881523 @ Override
14891524 public final <T > T getExtension (
0 commit comments