You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/10/31 00:53:09 UTC

[logging-log4j2] 01/13: Extract Cast::cast utility method

This is an automated email from the ASF dual-hosted git repository.

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit f7ea51a3235aeafc13d0dd0a0d155d6312a275ef
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Sat Oct 22 13:29:39 2022 -0500

    Extract Cast::cast utility method
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../org/apache/log4j/builders/BuilderManager.java  |  4 +-
 .../test/java/org/apache/log4j/CategoryTest.java   |  4 +-
 .../org/apache/logging/log4j/util/LazyUtil.java    |  9 ++---
 .../java/org/apache/logging/log4j/util3/Cast.java  | 28 +++++++++++++
 .../log4j/core/config/AbstractConfiguration.java   |  6 +--
 .../log4j/core/config/jason/JsonConfiguration.java | 16 ++++----
 .../plugins/visit/PluginConfigurationVisitor.java  |  5 ++-
 .../plugins/visit/PluginLoggerContextVisitor.java  |  5 ++-
 .../logging/log4j/couchdb/CouchDbProvider.java     |  4 +-
 .../logging/log4j/mongodb3/MongoDb3Provider.java   |  4 +-
 .../logging/log4j/plugins/di/InjectorTest.java     |  4 +-
 .../org/apache/logging/log4j/plugins/Node.java     |  4 +-
 .../log4j/plugins/convert/TypeConverter.java       |  4 +-
 .../logging/log4j/plugins/di/BindingMap.java       |  8 ++--
 .../logging/log4j/plugins/di/DefaultInjector.java  | 47 +++++++++++-----------
 .../org/apache/logging/log4j/plugins/di/Key.java   |  9 +++--
 .../org/apache/logging/log4j/plugins/di/Keys.java  |  4 +-
 .../logging/log4j/plugins/model/PluginType.java    |  4 +-
 .../logging/log4j/plugins/util/TypeUtil.java       |  5 ---
 .../validation/validators/ValidPortValidator.java  |  4 +-
 .../log4j/plugins/visit/PluginElementVisitor.java  |  5 ++-
 .../log4j/plugins/visit/PluginNodeVisitor.java     |  5 ++-
 .../log4j/plugins/visit/PluginValueVisitor.java    |  6 +--
 23 files changed, 110 insertions(+), 84 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
index 1b755ef6dc..88fd555310 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/BuilderManager.java
@@ -36,8 +36,8 @@ import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.plugins.model.PluginType;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Cast;
 import org.w3c.dom.Element;
 
 import java.util.Locale;
@@ -100,7 +100,7 @@ public class BuilderManager {
         if (pluginType == null) {
             LOGGER.warn("Unable to load plugin class name {} with key {}", className, key);
         }
-        return TypeUtil.cast(pluginType);
+        return Cast.cast(pluginType);
     }
 
     private <T extends Builder<U>, U> U newInstance(final PluginType<T> plugin, final Function<T, U> consumer,
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
index 481e92340b..0a8ddb7011 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
@@ -29,8 +29,8 @@ import org.apache.logging.log4j.message.MapMessage;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ObjectMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.Constants;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
@@ -331,7 +331,7 @@ public class CategoryTest {
         final Class<? extends Message> actualMessageClass = message.getClass();
         assertTrue(expectedMessageClass.isAssignableFrom(actualMessageClass),
                 "was expecting message to be instance of " + expectedMessageClass + ", found: " + actualMessageClass);
-        final M typedMessage = TypeUtil.cast(message);
+        final M typedMessage = Cast.cast(message);
         messageTester.accept(typedMessage);
 
     }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LazyUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LazyUtil.java
index 7f15a0bb42..750b6d2392 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LazyUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LazyUtil.java
@@ -17,6 +17,8 @@
 
 package org.apache.logging.log4j.util;
 
+import org.apache.logging.log4j.util3.Cast;
+
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
 import java.util.concurrent.locks.Lock;
@@ -36,12 +38,7 @@ final class LazyUtil {
     }
 
     static <T> T unwrapNull(final Object value) {
-        return value == NULL ? null : cast(value);
-    }
-
-    @SuppressWarnings("unchecked")
-    static <T> T cast(final Object o) {
-        return (T) o;
+        return value == NULL ? null : Cast.cast(value);
     }
 
     static class Constant<T> implements Lazy<T> {
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util3/Cast.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Cast.java
new file mode 100644
index 0000000000..0be31b189e
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Cast.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+
+package org.apache.logging.log4j.util3;
+
+public final class Cast {
+    public static <T> T cast(final Object o) {
+        @SuppressWarnings("unchecked") final T t = (T) o;
+        return t;
+    }
+
+    private Cast() {
+    }
+}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 4f77448f76..39be877469 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -59,8 +59,8 @@ import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.di.Keys;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.plugins.model.PluginType;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.util.Lazy;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.NameUtil;
 import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util3.ServiceRegistry;
@@ -519,7 +519,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
 
     @Override
     public <T> T getComponent(final String componentName) {
-        return TypeUtil.cast(componentMap.get(componentName));
+        return Cast.cast(componentMap.get(componentName));
     }
 
     @Override
@@ -806,7 +806,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
      */
     @Override
     public <T extends Appender> T getAppender(final String appenderName) {
-        return appenderName != null ? TypeUtil.cast(appenders.get(appenderName)) : null;
+        return appenderName != null ? Cast.cast(appenders.get(appenderName)) : null;
     }
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/jason/JsonConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/jason/JsonConfiguration.java
index 4b358320f0..6171168464 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/jason/JsonConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/jason/JsonConfiguration.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.model.PluginType;
 import org.apache.logging.log4j.plugins.util.ResolverUtil;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.util3.Cast;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -52,11 +52,11 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
             final byte[] bytes;
             try (final var configStream = configurationSource.getInputStream()) {
                 bytes = configStream.readAllBytes();
-                root = TypeUtil.cast(JsonReader.read(new String(bytes, StandardCharsets.UTF_8)));
+                root = Cast.cast(JsonReader.read(new String(bytes, StandardCharsets.UTF_8)));
             }
             if (root.size() == 1) {
                 for (final Object value : root.values()) {
-                    root = TypeUtil.cast(value);
+                    root = Cast.cast(value);
                 }
             }
             processAttributes(rootNode, root);
@@ -101,7 +101,7 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
         root.forEach((key, value) -> {
             if (value instanceof Map) {
                 LOGGER.debug("Processing node for object {}", key);
-                children.add(constructNode(key, rootNode, TypeUtil.cast(value)));
+                children.add(constructNode(key, rootNode, Cast.cast(value)));
             }
         });
         LOGGER.debug("Completed parsing configuration");
@@ -131,7 +131,7 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
                 LOGGER.debug("Processing node for array {}", k);
                 ((List<?>) v).forEach(object -> {
                     if (object instanceof Map<?, ?>) {
-                        final Map<String, Object> map = TypeUtil.cast(object);
+                        final Map<String, Object> map = Cast.cast(object);
                         final String type = getType(map).orElse(k);
                         final PluginType<?> entryType = corePlugins.get(type);
                         final Node child = new Node(node, k, entryType);
@@ -145,12 +145,12 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
                         map.forEach((itemKey, itemValue) -> {
                             if (itemValue instanceof Map<?, ?>) {
                                 LOGGER.debug("Processing node for object {}", itemKey);
-                                grandchildren.add(constructNode(itemKey, child, TypeUtil.cast(itemValue)));
+                                grandchildren.add(constructNode(itemKey, child, Cast.cast(itemValue)));
                             } else if (itemValue instanceof List<?>) {
                                 final List<?> list = (List<?>) itemValue;
                                 LOGGER.debug("Processing array for object {}", itemKey);
                                 list.forEach(subValue -> grandchildren.add(
-                                        constructNode(itemKey, child, TypeUtil.cast(subValue))));
+                                        constructNode(itemKey, child, Cast.cast(subValue))));
                             }
                         });
                         children.add(child);
@@ -158,7 +158,7 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
                 });
             } else {
                 LOGGER.debug("Processing node for object {}", k);
-                children.add(constructNode(k, node, TypeUtil.cast(v)));
+                children.add(constructNode(k, node, Cast.cast(v)));
             }
         });
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java
index fb04dbba65..9e3898ea28 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
@@ -43,7 +44,7 @@ public class PluginConfigurationVisitor implements NodeVisitor {
     public Object visitField(final Field field, final Node node, final StringBuilder debugLog) {
         if (TypeUtil.isAssignable(field.getGenericType(), configuration.getClass())) {
             StringBuilders.appendKeyDqValueWithJoiner(debugLog, "configuration", configuration, ", ");
-            return TypeUtil.cast(configuration);
+            return Cast.cast(configuration);
         } else {
             LOGGER.error("Field {} annotated with @PluginConfiguration is not compatible with type {}", field,
                     configuration.getClass());
@@ -55,7 +56,7 @@ public class PluginConfigurationVisitor implements NodeVisitor {
     public Object visitParameter(final Parameter parameter, final Node node, final StringBuilder debugLog) {
         if (TypeUtil.isAssignable(parameter.getParameterizedType(), configuration.getClass())) {
             StringBuilders.appendKeyDqValueWithJoiner(debugLog, "configuration", configuration, ", ");
-            return TypeUtil.cast(configuration);
+            return Cast.cast(configuration);
         } else {
             LOGGER.error("Parameter {} annotated with @PluginConfiguration is not compatible with type {}", parameter,
                     configuration.getClass());
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java
index 52a1d9e591..8a56a50000 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.ref.WeakReference;
@@ -47,7 +48,7 @@ public class PluginLoggerContextVisitor implements NodeVisitor {
     public Object visitField(final Field field, final Node node, final StringBuilder debugLog) {
         if (TypeUtil.isAssignable(field.getGenericType(), LoggerContext.class)) {
             StringBuilders.appendKeyDqValueWithJoiner(debugLog, "loggerContext", loggerContext, ", ");
-            return TypeUtil.cast(loggerContext);
+            return Cast.cast(loggerContext);
         } else {
             LOGGER.error("Field {} annotated with @PluginLoggerContext is not compatible with type {}", field,
                     loggerContext.getClass());
@@ -59,7 +60,7 @@ public class PluginLoggerContextVisitor implements NodeVisitor {
     public Object visitParameter(final Parameter parameter, final Node node, final StringBuilder debugLog) {
         if (TypeUtil.isAssignable(parameter.getParameterizedType(), loggerContext.getClass())) {
             StringBuilders.appendKeyDqValueWithJoiner(debugLog, "loggerContext", loggerContext, ", ");
-            return TypeUtil.cast(loggerContext);
+            return Cast.cast(loggerContext);
         } else {
             LOGGER.error("Parameter {} annotated with @PluginLoggerContext is not compatible with type {}",
                     parameter, loggerContext.getClass());
diff --git a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
index 61c0ace36e..0d031c637f 100644
--- a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
+++ b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
@@ -24,11 +24,11 @@ import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.di.Injector;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.LoaderUtil;
 import org.lightcouch.CouchDbClient;
 import org.lightcouch.CouchDbProperties;
@@ -144,7 +144,7 @@ public final class CouchDbProvider implements NoSqlProvider<CouchDbConnection> {
                 LOGGER.warn("No protocol specified, using default port [http].");
             }
 
-            final TypeConverter<Integer> converter = TypeUtil.cast(injector.getTypeConverter(Integer.class));
+            final TypeConverter<Integer> converter = Cast.cast(injector.getTypeConverter(Integer.class));
             final int portInt = converter.convert(port, protocol.equals("https") ? HTTPS : HTTP);
 
             if (Strings.isEmpty(username) || Strings.isEmpty(password)) {
diff --git a/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java b/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java
index ff6a6abc60..bf57edf1e8 100644
--- a/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java
+++ b/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java
@@ -32,12 +32,12 @@ import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.di.Injector;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.LoaderUtil;
 import org.bson.codecs.configuration.CodecRegistries;
 import org.bson.codecs.configuration.CodecRegistry;
@@ -185,7 +185,7 @@ public final class MongoDb3Provider implements NoSqlProvider<MongoDb3Connection>
                     mongoCredential = MongoCredential.createCredential(userName, databaseName, password.toCharArray());
                 }
                 try {
-                    final TypeConverter<Integer> converter = TypeUtil.cast(injector.getTypeConverter(Integer.class));
+                    final TypeConverter<Integer> converter = Cast.cast(injector.getTypeConverter(Integer.class));
                     final int portInt = converter.convert(port, DEFAULT_PORT);
                     description += ", server=" + server + ", port=" + portInt;
                     final WriteConcern writeConcern = toWriteConcern(writeConcernConstant, writeConcernConstantClassName);
diff --git a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/InjectorTest.java b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/InjectorTest.java
index 8f7d9be224..134248383e 100644
--- a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/InjectorTest.java
+++ b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/di/InjectorTest.java
@@ -40,9 +40,9 @@ import org.apache.logging.log4j.plugins.test.validation.generic.AlphaBean;
 import org.apache.logging.log4j.plugins.test.validation.generic.BaseBean;
 import org.apache.logging.log4j.plugins.test.validation.generic.BetaBean;
 import org.apache.logging.log4j.plugins.test.validation.generic.GammaBean;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.plugins.validation.constraints.RequiredProperty;
+import org.apache.logging.log4j.util3.Cast;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.ResourceLock;
 import org.junit.jupiter.api.parallel.Resources;
@@ -429,7 +429,7 @@ class InjectorTest {
 
         @Override
         public <T> Supplier<T> get(final Key<T> key, final Supplier<T> unscoped) {
-            return () -> TypeUtil.cast(bindings.computeIfAbsent(key, ignored -> unscoped.get()));
+            return () -> Cast.cast(bindings.computeIfAbsent(key, ignored -> unscoped.get()));
         }
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
index 80e93c4211..92925ca1ad 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/Node.java
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.plugins;
 
 import org.apache.logging.log4j.plugins.model.PluginType;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.util3.Cast;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -136,7 +136,7 @@ public class Node {
 
     @SuppressWarnings("unchecked")
     public <T> T getObject() {
-        return (T) object;
+        return Cast.cast(object);
     }
 
     /**
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
index 0aa5ea9481..b6e183e5a2 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/TypeConverter.java
@@ -17,8 +17,8 @@
 
 package org.apache.logging.log4j.plugins.convert;
 
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Cast;
 
 /**
  * Interface for doing automatic String conversion to a specific type.
@@ -55,7 +55,7 @@ public interface TypeConverter<T> {
             return null;
         }
         if (!(defaultValue instanceof String)) {
-            return TypeUtil.cast(defaultValue);
+            return Cast.cast(defaultValue);
         }
         try {
             return convert((String) defaultValue);
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/BindingMap.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/BindingMap.java
index e52beb6575..4186957a4e 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/BindingMap.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/BindingMap.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.plugins.di;
 
-import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.util3.Cast;
 
 import java.util.Collection;
 import java.util.Map;
@@ -36,7 +36,7 @@ class BindingMap {
     }
 
     public <T> Binding<T> get(final Key<T> key) {
-        return TypeUtil.cast(bindings.get(key));
+        return Cast.cast(bindings.get(key));
     }
 
     public <T> Binding<T> get(final Key<T> key, final Collection<String> aliases) {
@@ -49,7 +49,7 @@ class BindingMap {
                 }
             }
         }
-        return TypeUtil.cast(binding);
+        return Cast.cast(binding);
     }
 
     public <T> void put(final Key<T> key, final Supplier<T> factory) {
@@ -62,7 +62,7 @@ class BindingMap {
     public <T> Supplier<T> merge(final Key<T> key, final Supplier<T> factory) {
         final Binding<?> newBinding = bindings.merge(key, Binding.bind(key, factory), (oldBinding, binding) ->
                 oldBinding.getKey().getOrder() <= binding.getKey().getOrder() ? oldBinding : binding);
-        return TypeUtil.cast(newBinding.getSupplier());
+        return Cast.cast(newBinding.getSupplier());
     }
 
     public <T> void bindIfAbsent(final Key<T> key, final Supplier<T> factory) {
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java
index 8ac83cd57f..c7e8d4b813 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java
@@ -40,6 +40,7 @@ import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.EnglishEnums;
 import org.apache.logging.log4j.util3.ServiceRegistry;
 import org.apache.logging.log4j.util3.StringBuilders;
@@ -230,9 +231,9 @@ class DefaultInjector implements Injector {
         final NodeVisitor visitor = visitorKey != null ? getInstance(visitorKey) : null;
         if (visitor != null) {
             if (element instanceof Field) {
-                return () -> TypeUtil.cast(visitor.visitField((Field) element, node, debugLog));
+                return () -> Cast.cast(visitor.visitField((Field) element, node, debugLog));
             } else {
-                return () -> TypeUtil.cast(visitor.visitParameter((Parameter) element, node, debugLog));
+                return () -> Cast.cast(visitor.visitParameter((Parameter) element, node, debugLog));
             }
         }
         final Key<T> key = point.getKey();
@@ -253,34 +254,34 @@ class DefaultInjector implements Injector {
 
         // @Namespace PluginNamespace injection
         if (rawType == PluginNamespace.class && !key.getNamespace().isEmpty()) {
-            final Key<PluginNamespace> pluginNamespaceKey = TypeUtil.cast(key);
+            final Key<PluginNamespace> pluginNamespaceKey = Cast.cast(key);
             final Supplier<PluginNamespace> pluginNamespaceFactory = createPluginNamespaceFactory(pluginNamespaceKey);
-            return TypeUtil.cast(bindingMap.merge(pluginNamespaceKey, pluginNamespaceFactory));
+            return Cast.cast(bindingMap.merge(pluginNamespaceKey, pluginNamespaceFactory));
         }
 
         // @Namespace Collection<T>/Map<String, T>/Stream<T>/etc. injection
         if (COLLECTION_INJECTION_TYPES.contains(rawType) && !key.getNamespace().isEmpty()) {
             if (Stream.class.isAssignableFrom(rawType)) {
-                final Key<Stream<T>> streamKey = TypeUtil.cast(key);
+                final Key<Stream<T>> streamKey = Cast.cast(key);
                 final Supplier<Stream<T>> streamFactory =
                         () -> streamPluginInstancesFromNamespace(key.getParameterizedTypeArgument(0));
-                return TypeUtil.cast(bindingMap.merge(streamKey, streamFactory));
+                return Cast.cast(bindingMap.merge(streamKey, streamFactory));
             } else if (Set.class.isAssignableFrom(rawType)) {
-                final Key<Set<T>> setKey = TypeUtil.cast(key);
+                final Key<Set<T>> setKey = Cast.cast(key);
                 final Supplier<Set<T>> setFactory = () -> getPluginSet(key.getParameterizedTypeArgument(0));
-                return TypeUtil.cast(bindingMap.merge(setKey, setFactory));
+                return Cast.cast(bindingMap.merge(setKey, setFactory));
             } else if (Map.class.isAssignableFrom(rawType)) {
-                final Key<Map<String, T>> mapKey = TypeUtil.cast(key);
+                final Key<Map<String, T>> mapKey = Cast.cast(key);
                 final Supplier<Map<String, T>> mapFactory = () -> getPluginMap(key.getParameterizedTypeArgument(1));
-                return TypeUtil.cast(bindingMap.merge(mapKey, mapFactory));
+                return Cast.cast(bindingMap.merge(mapKey, mapFactory));
             } else if (Iterable.class.isAssignableFrom(rawType)) {
-                final Key<Iterable<T>> iterableKey = TypeUtil.cast(key);
+                final Key<Iterable<T>> iterableKey = Cast.cast(key);
                 final Supplier<Iterable<T>> iterableFactory = () -> getPluginList(key.getParameterizedTypeArgument(0));
-                return TypeUtil.cast(bindingMap.merge(iterableKey, iterableFactory));
+                return Cast.cast(bindingMap.merge(iterableKey, iterableFactory));
             } else if (Optional.class.isAssignableFrom(rawType)) {
-                final Key<Optional<T>> optionalKey = TypeUtil.cast(key);
+                final Key<Optional<T>> optionalKey = Cast.cast(key);
                 final Supplier<Optional<T>> optionalFactory = () -> getOptionalPlugin(key.getParameterizedTypeArgument(0));
-                return TypeUtil.cast(bindingMap.merge(optionalKey, optionalFactory));
+                return Cast.cast(bindingMap.merge(optionalKey, optionalFactory));
             } else {
                 throw new InjectException("Cannot inject plugins into " + key);
             }
@@ -288,16 +289,16 @@ class DefaultInjector implements Injector {
 
         // Optional<T> injection
         if (rawType == Optional.class) {
-            final Key<Optional<T>> optionalKey = TypeUtil.cast(key);
+            final Key<Optional<T>> optionalKey = Cast.cast(key);
             final Supplier<Optional<T>> optionalFactory = () ->
                     getOptionalInstance(key.getParameterizedTypeArgument(0), aliases, node, chain);
-            return TypeUtil.cast(bindingMap.merge(optionalKey, optionalFactory));
+            return Cast.cast(bindingMap.merge(optionalKey, optionalFactory));
         }
 
         // default namespace generic T injection
         final Supplier<T> instanceSupplier = () -> {
             final StringBuilder debugLog = new StringBuilder();
-            final T instance = TypeUtil.cast(getInjectableInstance(key, node, chain, debugLog));
+            final T instance = Cast.cast(getInjectableInstance(key, node, chain, debugLog));
             injectMembers(key, node, instance, chain, debugLog);
             return instance;
         };
@@ -322,7 +323,7 @@ class DefaultInjector implements Injector {
         return namespace.stream()
                 .filter(pluginType -> TypeUtil.isAssignable(type, pluginType.getPluginClass()))
                 .sorted(Comparator.comparing(PluginType::getPluginClass, OrderedComparator.INSTANCE))
-                .map(TypeUtil::cast);
+                .map(o -> Cast.cast(o));
     }
 
     private <T> Stream<T> streamPluginInstancesFromNamespace(final Key<T> key) {
@@ -333,7 +334,7 @@ class DefaultInjector implements Injector {
             final Key<T> itemKey = key.getParameterizedTypeArgument(0);
             final Stream<Supplier<T>> factoryStream = streamPluginsFromNamespace(itemKey)
                     .map(pluginType -> getFactory(pluginType.getPluginClass()));
-            return TypeUtil.cast(factoryStream);
+            return Cast.cast(factoryStream);
         }
         return streamPluginsFromNamespace(key)
                 .map(pluginType -> getInstance(pluginType.getPluginClass()));
@@ -351,7 +352,7 @@ class DefaultInjector implements Injector {
                     pluginType -> getFactory(pluginType.getPluginClass()),
                     (lhs, rhs) -> lhs,
                     LinkedHashMap::new));
-            return TypeUtil.cast(map);
+            return Cast.cast(map);
         }
         return streamPluginsFromNamespace(key).collect(Collectors.toMap(
                 PluginType::getKey,
@@ -628,7 +629,7 @@ class DefaultInjector implements Injector {
                         return value;
                     })
                     .toArray();
-            return TypeUtil.cast(accessor.invokeMethod(method, instance, args));
+            return Cast.cast(accessor.invokeMethod(method, instance, args));
         };
         final Supplier<T> factory = getScopeForMethod(method).get(primaryKey, unscoped);
         final Collection<String> aliases = Keys.getAliases(method);
@@ -794,7 +795,7 @@ class DefaultInjector implements Injector {
             throw new InjectException("Multiple @Inject constructors found in " + rawType);
         }
         if (injectConstructors.size() == 1) {
-            return TypeUtil.cast(injectConstructors.get(0));
+            return Cast.cast(injectConstructors.get(0));
         }
         try {
             return rawType.getDeclaredConstructor();
@@ -829,7 +830,7 @@ class DefaultInjector implements Injector {
 
         @Override
         public <T> Supplier<T> get(final Key<T> key, final Supplier<T> unscoped) {
-            return TypeUtil.cast(singletonProviders.computeIfAbsent(key, ignored -> Lazy.lazy(unscoped)::value));
+            return Cast.cast(singletonProviders.computeIfAbsent(key, ignored -> Lazy.lazy(unscoped)::value));
         }
 
         @Override
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java
index 6e249ffe86..24557d8fce 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Key.java
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.plugins.QualifierType;
 import org.apache.logging.log4j.plugins.util.AnnotationUtil;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
@@ -64,7 +65,7 @@ public class Key<T> {
      */
     protected Key() {
         type = TypeUtil.getSuperclassTypeParameter(getClass());
-        rawType = TypeUtil.cast(TypeUtil.getRawType(type));
+        rawType = Cast.cast(TypeUtil.getRawType(type));
         final AnnotatedType superclass = getClass().getAnnotatedSuperclass();
         final Annotation qualifier = AnnotationUtil.getMetaAnnotation(superclass, QualifierType.class);
         qualifierType = qualifier != null ? qualifier.annotationType() : null;
@@ -300,7 +301,7 @@ public class Key<T> {
          */
         public <U> Builder<U> setType(final Type type) {
             this.type = type;
-            return TypeUtil.cast(this);
+            return Cast.cast(this);
         }
 
         /**
@@ -308,7 +309,7 @@ public class Key<T> {
          */
         public <U> Builder<U> setType(final Class<U> type) {
             this.type = type;
-            return TypeUtil.cast(this);
+            return Cast.cast(this);
         }
 
         /**
@@ -356,7 +357,7 @@ public class Key<T> {
             if (namespace == null) {
                 namespace = Strings.EMPTY;
             }
-            final Class<T> rawType = TypeUtil.cast(TypeUtil.getRawType(type));
+            final Class<T> rawType = Cast.cast(TypeUtil.getRawType(type));
             int order = this.order != null ? this.order : getOrder(rawType);
             return new Key<>(type, rawType, qualifierType, name, namespace, order);
         }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Keys.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Keys.java
index cffc67cc7d..2537340c97 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Keys.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/Keys.java
@@ -25,9 +25,9 @@ import org.apache.logging.log4j.plugins.name.AnnotatedElementAliasesProvider;
 import org.apache.logging.log4j.plugins.name.AnnotatedElementNameProvider;
 import org.apache.logging.log4j.plugins.name.NameProvider;
 import org.apache.logging.log4j.plugins.util.AnnotationUtil;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.util.ReflectionUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
@@ -159,7 +159,7 @@ public final class Keys {
     private static <A extends Annotation> Optional<String> getSpecifiedNameForAnnotation(final A annotation) {
         return Optional.ofNullable(annotation.annotationType().getAnnotation(NameProvider.class))
                 .map(NameProvider::value)
-                .map(TypeUtil::<Class<? extends AnnotatedElementNameProvider<A>>>cast)
+                .map(Cast::<Class<? extends AnnotatedElementNameProvider<A>>>cast)
                 .map(ReflectionUtil::instantiate)
                 .flatMap(provider -> provider.getSpecifiedName(annotation));
     }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginType.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginType.java
index c210d10713..163bd3e609 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginType.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginType.java
@@ -16,8 +16,8 @@
  */
 package org.apache.logging.log4j.plugins.model;
 
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.util.Lazy;
+import org.apache.logging.log4j.util3.Cast;
 
 /**
  * Plugin Descriptor. This is a memento object for Plugin annotations paired to their annotated classes.
@@ -51,7 +51,7 @@ public class PluginType<T> {
         this.pluginEntry = pluginEntry;
         this.pluginClass = Lazy.lazy(() -> {
             try {
-                return TypeUtil.cast(classLoader.loadClass(pluginEntry.getClassName()));
+                return Cast.cast(classLoader.loadClass(pluginEntry.getClassName()));
             } catch (final ClassNotFoundException e) {
                 throw new IllegalStateException("No class named " + pluginEntry.getClassName() +
                         " located for element " + pluginEntry.getName(), e);
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
index 5423ee3f6b..6402cd8f9d 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/TypeUtil.java
@@ -261,11 +261,6 @@ public final class TypeUtil {
         return clazz;
     }
 
-    public static <T> T cast(final Object o) {
-        @SuppressWarnings("unchecked") final T t = (T) o;
-        return t;
-    }
-
     public static Type getSuperclassTypeParameter(final Class<?> type) {
         final Type genericSuperclass = type.getGenericSuperclass();
         if (genericSuperclass instanceof ParameterizedType) {
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
index a65fecc2cc..3ae73e3a34 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/ValidPortValidator.java
@@ -20,10 +20,10 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.di.Injector;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Cast;
 
 /**
  * Validator that checks an object to verify it is a valid port number (an integer between 0 and 65535).
@@ -39,7 +39,7 @@ public class ValidPortValidator implements ConstraintValidator<ValidPort> {
 
     @Inject
     public ValidPortValidator(final Injector injector) {
-        converter = TypeUtil.cast(injector.getTypeConverter(Integer.class));
+        converter = Cast.cast(injector.getTypeConverter(Integer.class));
     }
 
     @Override
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java
index d1aa9d94a2..c83fc1ffaf 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.plugins.model.PluginType;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Array;
@@ -45,7 +46,7 @@ public class PluginElementVisitor implements NodeVisitor {
         final Collection<String> aliases = Keys.getAliases(field);
         final Type targetType = field.getGenericType();
         final Class<?> componentType = getComponentType(targetType);
-        return TypeUtil.cast(componentType != null ? parseArrayElement(node, name, aliases, componentType, debugLog) :
+        return Cast.cast(componentType != null ? parseArrayElement(node, name, aliases, componentType, debugLog) :
                 parseChildElement(node, name, aliases, targetType, debugLog));
     }
 
@@ -55,7 +56,7 @@ public class PluginElementVisitor implements NodeVisitor {
         final Collection<String> aliases = Keys.getAliases(parameter);
         final Type targetType = parameter.getParameterizedType();
         final Class<?> componentType = getComponentType(targetType);
-        return TypeUtil.cast(componentType != null ? parseArrayElement(node, name, aliases, componentType, debugLog) :
+        return Cast.cast(componentType != null ? parseArrayElement(node, name, aliases, componentType, debugLog) :
                 parseChildElement(node, name, aliases, targetType, debugLog));
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java
index ba788fd651..f95c02ab04 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java
@@ -21,6 +21,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
@@ -33,7 +34,7 @@ public class PluginNodeVisitor implements NodeVisitor {
     public Object visitField(final Field field, final Node node, final StringBuilder debugLog) {
         if (TypeUtil.isAssignable(field.getGenericType(), node.getClass())) {
             StringBuilders.appendKeyDqValueWithJoiner(debugLog, "node", node.getName(), ", ");
-            return TypeUtil.cast(node);
+            return Cast.cast(node);
         } else {
             LOGGER.error("Cannot inject Node instance into field {}", field);
             return null;
@@ -44,7 +45,7 @@ public class PluginNodeVisitor implements NodeVisitor {
     public Object visitParameter(final Parameter parameter, final Node node, final StringBuilder debugLog) {
         if (TypeUtil.isAssignable(parameter.getParameterizedType(), node.getClass())) {
             StringBuilders.appendKeyDqValueWithJoiner(debugLog, "node", node.getName(), ", ");
-            return TypeUtil.cast(node);
+            return Cast.cast(node);
         } else {
             LOGGER.error("Cannot inject Node instance into parameter {}", parameter);
             return null;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java
index 391832d889..8b7e941176 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java
@@ -22,9 +22,9 @@ import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.Named;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.di.Keys;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Cast;
 import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
@@ -66,13 +66,13 @@ public class PluginValueVisitor implements NodeVisitor {
     public Object visitField(final Field field, final Node node, final StringBuilder debugLog) {
         final String name = Keys.getName(field);
         final Collection<String> aliases = Keys.getAliases(field);
-        return TypeUtil.cast(parseValue(node, name, aliases, debugLog));
+        return Cast.cast(parseValue(node, name, aliases, debugLog));
     }
 
     @Override
     public Object visitParameter(final Parameter parameter, final Node node, final StringBuilder debugLog) {
         final String name = Keys.getName(parameter);
         final Collection<String> aliases = Keys.getAliases(parameter);
-        return TypeUtil.cast(parseValue(node, name, aliases, debugLog));
+        return Cast.cast(parseValue(node, name, aliases, debugLog));
     }
 }