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 2020/03/22 17:40:01 UTC

[logging-log4j2] 01/06: Remove unused type parameters

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

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

commit b95c818cfb6baea30a8b49d16ccbd08a02402271
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sat Mar 21 12:40:49 2020 -0500

    Remove unused type parameters
    
    These type parameters are occasionally used by their concrete implementations,
    but this can be a hidden detail.
    
    Signed-off-by: Matt Sicker <bo...@gmail.com>
---
 .../log4j/plugins/defaults/bean/AbstractBean.java  | 10 +++---
 .../plugins/defaults/bean/AbstractProducer.java    |  4 +--
 .../defaults/bean/AbstractProducerFactory.java     | 11 ++++---
 .../plugins/defaults/bean/DefaultBeanManager.java  | 36 +++++++++++-----------
 .../bean/DefaultInitializationContext.java         |  2 +-
 .../defaults/bean/DefaultInjectionTarget.java      | 29 ++++++-----------
 .../bean/DefaultInjectionTargetFactory.java        |  2 +-
 .../plugins/defaults/bean/DefaultInjector.java     | 18 ++++++-----
 .../log4j/plugins/defaults/bean/FieldProducer.java |  6 ++--
 .../defaults/bean/FieldProducerFactory.java        |  2 +-
 .../plugins/defaults/bean/InjectionTargetBean.java |  4 +--
 .../plugins/defaults/bean/MethodProducer.java      |  8 ++---
 .../defaults/bean/MethodProducerFactory.java       |  6 ++--
 .../log4j/plugins/defaults/bean/ProducerBean.java  |  8 ++---
 .../log4j/plugins/defaults/bean/SystemBean.java    |  8 ++---
 .../defaults/model/AbstractMetaExecutable.java     |  8 ++---
 .../plugins/defaults/model/AbstractMetaMember.java |  2 +-
 .../defaults/model/DefaultElementManager.java      | 22 ++++++-------
 .../defaults/model/DefaultInjectionPoint.java      | 14 ++++-----
 .../model/DefaultMetaAnnotationElement.java        |  6 ----
 .../defaults/model/DefaultMetaParameter.java       | 10 +++---
 .../plugins/spi/UnsatisfiedBeanException.java      |  2 +-
 .../logging/log4j/plugins/spi/bean/Bean.java       |  2 +-
 .../log4j/plugins/spi/bean/BeanManager.java        |  2 +-
 .../logging/log4j/plugins/spi/bean/Injector.java   | 10 +++---
 .../logging/log4j/plugins/spi/bean/Producer.java   |  2 +-
 .../log4j/plugins/spi/bean/ProducerFactory.java    |  2 +-
 .../log4j/plugins/spi/model/ElementManager.java    | 18 +++++------
 .../log4j/plugins/spi/model/InjectionPoint.java    |  8 ++---
 .../plugins/spi/model/MetaAnnotationElement.java   |  2 +-
 .../logging/log4j/plugins/spi/model/MetaClass.java |  2 +-
 .../log4j/plugins/spi/model/MetaConstructor.java   |  2 +-
 .../log4j/plugins/spi/model/MetaElement.java       |  7 +++--
 .../log4j/plugins/spi/model/MetaExecutable.java    |  4 +--
 .../logging/log4j/plugins/spi/model/MetaField.java |  2 +-
 .../log4j/plugins/spi/model/MetaMember.java        |  2 +-
 .../log4j/plugins/spi/model/MetaMethod.java        |  2 +-
 .../log4j/plugins/spi/model/MetaParameter.java     |  2 +-
 .../log4j/plugins/test/BeanJUnit4Runner.java       |  2 +-
 39 files changed, 137 insertions(+), 152 deletions(-)

diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractBean.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractBean.java
index 947d722..c9110bf 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractBean.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractBean.java
@@ -27,17 +27,17 @@ import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Objects;
 
-abstract class AbstractBean<D, T> implements Bean<T> {
+abstract class AbstractBean<T> implements Bean<T> {
     private final Variable variable;
-    private final MetaClass<D> declaringClass;
+    private final MetaClass<?> declaringClass;
 
-    AbstractBean(final Variable variable, final MetaClass<D> declaringClass) {
+    AbstractBean(final Variable variable, final MetaClass<?> declaringClass) {
         this.variable = Objects.requireNonNull(variable);
         this.declaringClass = declaringClass;
     }
 
     @Override
-    public MetaClass<D> getDeclaringClass() {
+    public MetaClass<?> getDeclaringClass() {
         return declaringClass;
     }
 
@@ -60,7 +60,7 @@ abstract class AbstractBean<D, T> implements Bean<T> {
     public boolean equals(final Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
-        final AbstractBean<?, ?> that = (AbstractBean<?, ?>) o;
+        final AbstractBean<?> that = (AbstractBean<?>) o;
         return variable.equals(that.variable) &&
                 Objects.equals(declaringClass, that.declaringClass);
     }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java
index 5781a2b..df73dc6 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducer.java
@@ -33,11 +33,11 @@ abstract class AbstractProducer<P, T> implements Producer<T> {
     private final BeanManager beanManager;
     private final Bean<P> producerBean;
     private final MetaMethod<P, ?> disposerMethod;
-    private final Collection<InjectionPoint<?>> disposerInjectionPoints;
+    private final Collection<InjectionPoint> disposerInjectionPoints;
     final Injector injector;
 
     AbstractProducer(final BeanManager beanManager, final Bean<P> producerBean, final MetaMethod<P, ?> disposerMethod,
-                     final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+                     final Collection<InjectionPoint> disposerInjectionPoints) {
         this.beanManager = beanManager;
         this.producerBean = producerBean;
         this.disposerMethod = disposerMethod;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducerFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducerFactory.java
index a73840f..2ded1aa 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducerFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/AbstractProducerFactory.java
@@ -26,14 +26,15 @@ import org.apache.logging.log4j.plugins.spi.model.MetaMethod;
 import java.util.Collection;
 import java.util.Objects;
 
-abstract class AbstractProducerFactory<D> implements ProducerFactory<D> {
+abstract class AbstractProducerFactory<D> implements ProducerFactory {
     final Bean<D> declaringBean;
-    final MetaMember<D, ?> producerMember;
+    final MetaMember<D> producerMember;
     final MetaMethod<D, ?> disposerMethod;
-    final Collection<InjectionPoint<?>> disposerInjectionPoints;
+    final Collection<InjectionPoint> disposerInjectionPoints;
 
-    AbstractProducerFactory(final Bean<D> declaringBean, final MetaMember<D, ?> producerMember,
-                            final MetaMethod<D, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+    AbstractProducerFactory(final Bean<D> declaringBean, final MetaMember<D> producerMember,
+                            final MetaMethod<D, ?> disposerMethod,
+                            final Collection<InjectionPoint> disposerInjectionPoints) {
         this.declaringBean = declaringBean;
         this.producerMember = Objects.requireNonNull(producerMember);
         this.disposerMethod = disposerMethod;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java
index eb369be..592a279 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanManager.java
@@ -154,7 +154,7 @@ public class DefaultBeanManager implements BeanManager {
 
     private <T> void loadDisposerMethods(final MetaClass<T> metaClass, final Bean<T> bean) {
         for (final MetaMethod<T, ?> method : metaClass.getMethods()) {
-            for (final MetaParameter<?> parameter : method.getParameters()) {
+            for (final MetaParameter parameter : method.getParameters()) {
                 if (parameter.isAnnotationPresent(Disposes.class)) {
                     disposesMethods.add(new DisposesMethod<>(
                             parameter.getType(), elementManager.getQualifiers(parameter), bean, method));
@@ -178,24 +178,24 @@ public class DefaultBeanManager implements BeanManager {
         return beans;
     }
 
-    private <P, T> Bean<T> loadProducerBean(final MetaMember<P, T> member, final Bean<P> producingBean) {
+    private <P> Bean<?> loadProducerBean(final MetaMember<P> member, final Bean<P> producingBean) {
         final Variable variable = elementManager.createVariable(member);
         final MetaClass<P> declaringType = member.getDeclaringClass();
-        final ProducerFactory<P> factory = getProducerFactory(member, producingBean);
+        final ProducerFactory factory = getProducerFactory(member, producingBean);
         return addBean(new ProducerBean<>(variable, declaringType, factory));
     }
 
-    private <P> ProducerFactory<P> getProducerFactory(final MetaMember<P, ?> member, final Bean<P> producingBean) {
+    private <P> ProducerFactory getProducerFactory(final MetaMember<P> member, final Bean<P> producingBean) {
         final Variable variable = elementManager.createVariable(member);
         final MetaMethod<P, ?> disposerMethod = resolveDisposerMethod(variable, producingBean);
-        final Collection<InjectionPoint<?>> disposerIPs = disposerMethod == null ? Collections.emptySet() :
+        final Collection<InjectionPoint> disposerIPs = disposerMethod == null ? Collections.emptySet() :
                 elementManager.createExecutableInjectionPoints(disposerMethod, producingBean);
         if (member instanceof MetaField<?, ?>) {
-            final MetaField<P, ?> field = TypeUtil.cast(member);
+            final MetaField<P, ?> field = (MetaField<P, ?>) member;
             return new FieldProducerFactory<>(this, producingBean, field, disposerMethod, disposerIPs);
         } else {
-            final MetaMethod<P, ?> method = TypeUtil.cast(member);
-            final Collection<InjectionPoint<?>> producerIPs =
+            final MetaMethod<P, ?> method = (MetaMethod<P, ?>) member;
+            final Collection<InjectionPoint> producerIPs =
                     elementManager.createExecutableInjectionPoints(method, producingBean);
             return new MethodProducerFactory<>(this, producingBean, method, producerIPs, disposerMethod, disposerIPs);
         }
@@ -219,7 +219,7 @@ public class DefaultBeanManager implements BeanManager {
     public void validateBeans(final Iterable<Bean<?>> beans) {
         final List<Throwable> errors = new ArrayList<>();
         for (final Bean<?> bean : beans) {
-            for (final InjectionPoint<?> point : bean.getInjectionPoints()) {
+            for (final InjectionPoint point : bean.getInjectionPoints()) {
                 try {
                     validateInjectionPoint(point);
                 } catch (final InjectionException e) {
@@ -232,8 +232,8 @@ public class DefaultBeanManager implements BeanManager {
         }
     }
 
-    private <T> void validateInjectionPoint(final InjectionPoint<T> point) {
-        final MetaElement<T> element = point.getElement();
+    private <T> void validateInjectionPoint(final InjectionPoint point) {
+        final MetaElement element = point.getElement();
         if (element.isAnnotationPresent(Produces.class)) {
             throw new DefinitionException("Cannot inject into a @Produces element: " + element);
         }
@@ -253,8 +253,8 @@ public class DefaultBeanManager implements BeanManager {
             final Bean<?> bean = point.getBean().orElseThrow(() -> new UnsatisfiedBeanException(point));
             if (bean instanceof InjectionTargetBean<?>) {
                 validateBeanInjectionPoint(point, bean.getDeclaringClass().getType());
-            } else if (bean instanceof ProducerBean<?, ?>) {
-                validateBeanInjectionPoint(point, ((ProducerBean<?, ?>) bean).getType());
+            } else if (bean instanceof ProducerBean<?>) {
+                validateBeanInjectionPoint(point, ((ProducerBean<?>) bean).getType());
             }
         }
         final Optional<Bean<T>> bean = getInjectionPointBean(point);
@@ -263,7 +263,7 @@ public class DefaultBeanManager implements BeanManager {
         }
     }
 
-    private void validateBeanInjectionPoint(final InjectionPoint<?> point, final Type expectedType) {
+    private void validateBeanInjectionPoint(final InjectionPoint point, final Type expectedType) {
         final Type type = point.getType();
         if (!(type instanceof ParameterizedType)) {
             throw new DefinitionException("Expected parameterized type for " + point + " but got " + expectedType);
@@ -282,7 +282,7 @@ public class DefaultBeanManager implements BeanManager {
         }
     }
 
-    private <T> Optional<Bean<T>> getInjectionPointBean(final InjectionPoint<T> point) {
+    private <T> Optional<Bean<T>> getInjectionPointBean(final InjectionPoint point) {
         // TODO: this will need to allow for TypeConverter usage somehow
         // first, look for an existing bean
         final Type type = point.getType();
@@ -373,9 +373,9 @@ public class DefaultBeanManager implements BeanManager {
     }
 
     @Override
-    public <T> Optional<T> getInjectableValue(final InjectionPoint<T> point, final InitializationContext<?> parentContext) {
-        final Bean<T> resolvedBean = getInjectionPointBean(point)
-                .orElseThrow(() -> new UnsatisfiedBeanException(point));
+    public <T> Optional<T> getInjectableValue(final InjectionPoint point, final InitializationContext<?> parentContext) {
+        final Optional<Bean<T>> optionalResolvedBean = getInjectionPointBean(point);
+        final Bean<T> resolvedBean = optionalResolvedBean.orElseThrow(() -> new UnsatisfiedBeanException(point));
         final Optional<T> existingValue = point.getBean()
                 .filter(bean -> !bean.equals(resolvedBean))
                 .flatMap(bean -> getExistingValue(resolvedBean, bean, parentContext));
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
index 3ed8893..7e54175 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
@@ -67,7 +67,7 @@ public class DefaultInitializationContext<T> implements InitializationContext<T>
     @Override
     public boolean isTrackingDependencies(final Bean<T> bean) {
         return !dependentInstances.isEmpty() ||
-                (bean instanceof AbstractBean<?, ?> && ((AbstractBean<?, ?>) bean).isTrackingDependencies());
+                (bean instanceof AbstractBean<?> && ((AbstractBean<?>) bean).isTrackingDependencies());
     }
 
     @Override
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTarget.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTarget.java
index 869fa00..069ead6 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTarget.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTarget.java
@@ -27,7 +27,6 @@ import org.apache.logging.log4j.plugins.spi.model.ElementManager;
 import org.apache.logging.log4j.plugins.spi.model.InjectionPoint;
 import org.apache.logging.log4j.plugins.spi.model.MetaClass;
 import org.apache.logging.log4j.plugins.spi.model.MetaConstructor;
-import org.apache.logging.log4j.plugins.spi.model.MetaElement;
 import org.apache.logging.log4j.plugins.spi.model.MetaField;
 import org.apache.logging.log4j.plugins.spi.model.MetaMember;
 import org.apache.logging.log4j.plugins.spi.model.MetaMethod;
@@ -44,13 +43,13 @@ import java.util.stream.Collectors;
 class DefaultInjectionTarget<T> implements InjectionTarget<T> {
     private final Injector injector;
     private final ElementManager elementManager;
-    private final Collection<InjectionPoint<?>> injectionPoints;
+    private final Collection<InjectionPoint> injectionPoints;
     private final MetaConstructor<T> constructor;
     private final List<MetaMethod<T, ?>> postConstructMethods;
     private final List<MetaMethod<T, ?>> preDestroyMethods;
 
     DefaultInjectionTarget(final Injector injector, final ElementManager elementManager,
-                           final Collection<InjectionPoint<?>> injectionPoints, final MetaConstructor<T> constructor,
+                           final Collection<InjectionPoint> injectionPoints, final MetaConstructor<T> constructor,
                            final List<MetaMethod<T, ?>> postConstructMethods, final List<MetaMethod<T, ?>> preDestroyMethods) {
         this.injector = injector;
         this.elementManager = elementManager;
@@ -62,7 +61,7 @@ class DefaultInjectionTarget<T> implements InjectionTarget<T> {
 
     @Override
     public T produce(final InitializationContext<T> context) {
-        final Set<InjectionPoint<?>> constructorInjectionPoints = injectionPoints.stream()
+        final Set<InjectionPoint> constructorInjectionPoints = injectionPoints.stream()
                 .filter(point -> constructor.equals(point.getMember()))
                 .collect(Collectors.toSet());
         return injector.construct(constructor, constructorInjectionPoints, context);
@@ -82,29 +81,21 @@ class DefaultInjectionTarget<T> implements InjectionTarget<T> {
     }
 
     private void injectFields(final T instance, final InitializationContext<T> context) {
-        for (final InjectionPoint<?> point : injectionPoints) {
-            injectField(instance, context, point);
-        }
-    }
-
-    private <F> void injectField(final T instance, final InitializationContext<T> context, final InjectionPoint<F> point) {
-        final MetaElement<F> element = point.getElement();
-        if (element instanceof MetaField<?, ?> && ((MetaField<?, F>) element).getDeclaringClass().getJavaClass().isInstance(instance)) {
-            final MetaField<T, F> field = (MetaField<T, F>) element;
-            injector.set(instance, field, point, context);
-        }
+        injectionPoints.stream()
+                .filter(point -> point.getElement() instanceof MetaField<?, ?>)
+                .forEachOrdered(point -> injector.set(instance, TypeUtil.cast(point.getElement()), point, context));
     }
 
     private void injectMethods(final T instance, final InitializationContext<T> context) {
-        final Set<MetaMember<?, ?>> injectedMethods = new HashSet<>();
-        for (final InjectionPoint<?> point : injectionPoints) {
+        final Set<MetaMember<?>> injectedMethods = new HashSet<>();
+        for (final InjectionPoint point : injectionPoints) {
             if (point.getMember() instanceof MetaMethod<?, ?> &&
                     point.getMember().getDeclaringClass().getJavaClass().isInstance(instance) &&
                     !injectedMethods.contains(point.getMember()) &&
                     !point.getElement().isAnnotationPresent(Produces.class) &&
                     !point.getElement().isAnnotationPresent(Disposes.class)) {
                 final MetaMethod<T, ?> method = TypeUtil.cast(point.getMember());
-                final Set<InjectionPoint<?>> methodInjectionPoints = injectionPoints.stream()
+                final Set<InjectionPoint> methodInjectionPoints = injectionPoints.stream()
                         .filter(p -> method.equals(p.getMember()))
                         .collect(Collectors.toSet());
                 injector.invoke(instance, method, methodInjectionPoints, context);
@@ -128,7 +119,7 @@ class DefaultInjectionTarget<T> implements InjectionTarget<T> {
     }
 
     @Override
-    public Collection<InjectionPoint<?>> getInjectionPoints() {
+    public Collection<InjectionPoint> getInjectionPoints() {
         return injectionPoints;
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTargetFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTargetFactory.java
index 30c30ec..78ab70d 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTargetFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjectionTargetFactory.java
@@ -53,7 +53,7 @@ class DefaultInjectionTargetFactory<T> implements InjectionTargetFactory<T> {
     @Override
     public InjectionTarget<T> createInjectionTarget(final Bean<T> bean) {
         final MetaConstructor<T> constructor = getInjectableConstructor();
-        final Collection<InjectionPoint<?>> injectionPoints =
+        final Collection<InjectionPoint> injectionPoints =
                 new HashSet<>(elementManager.createExecutableInjectionPoints(constructor, bean));
         for (final MetaField<T, ?> field : type.getFields()) {
             if (elementManager.isInjectable(field)) {
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java
index 0d12b6f..6e228a8 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInjector.java
@@ -29,6 +29,7 @@ import org.apache.logging.log4j.plugins.spi.model.MetaParameter;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 
 public class DefaultInjector implements Injector {
     private final BeanManager beanManager;
@@ -37,8 +38,8 @@ public class DefaultInjector implements Injector {
         this.beanManager = beanManager;
     }
 
-    private Object[] createArguments(final List<MetaParameter<?>> parameters,
-                                     final Collection<InjectionPoint<?>> injectionPoints,
+    private Object[] createArguments(final List<MetaParameter> parameters,
+                                     final Collection<InjectionPoint> injectionPoints,
                                      final InitializationContext<?> context, final Object producedInstance) {
         return parameters.stream().map(parameter ->
                 parameter.isAnnotationPresent(Disposes.class) ? producedInstance : injectionPoints.stream()
@@ -50,33 +51,34 @@ public class DefaultInjector implements Injector {
     }
 
     @Override
-    public <T> T construct(final MetaConstructor<T> constructor, final Collection<InjectionPoint<?>> points,
+    public <T> T construct(final MetaConstructor<T> constructor, final Collection<InjectionPoint> points,
                            final InitializationContext<T> context) {
         return constructor.construct(createArguments(constructor.getParameters(), points, context, null));
     }
 
     @Override
     public <D, T> T produce(final D producerInstance, final MetaMethod<D, T> producerMethod,
-                            final Collection<InjectionPoint<?>> points, final InitializationContext<D> context) {
+                            final Collection<InjectionPoint> points, final InitializationContext<D> context) {
         return producerMethod.invoke(producerInstance, createArguments(producerMethod.getParameters(), points, context, null));
     }
 
     @Override
     public <T> void dispose(final T disposerInstance, final MetaMethod<T, ?> disposerMethod,
-                            final Collection<InjectionPoint<?>> points, final Object instance,
+                            final Collection<InjectionPoint> points, final Object instance,
                             final InitializationContext<T> context) {
         disposerMethod.invoke(disposerInstance, createArguments(disposerMethod.getParameters(), points, context, instance));
     }
 
     @Override
-    public <T> void invoke(final T instance, final MetaMethod<T, ?> method, final Collection<InjectionPoint<?>> points,
+    public <T> void invoke(final T instance, final MetaMethod<T, ?> method, final Collection<InjectionPoint> points,
                            final InitializationContext<T> context) {
         method.invoke(instance, createArguments(method.getParameters(), points, context, null));
     }
 
     @Override
-    public <D, T> void set(final D instance, final MetaField<D, T> field, final InjectionPoint<T> point,
+    public <D, T> void set(final D instance, final MetaField<D, T> field, final InjectionPoint point,
                            final InitializationContext<D> context) {
-        beanManager.getInjectableValue(point, context).ifPresent(value -> field.set(instance, value));
+        final Optional<T> optionalValue = beanManager.getInjectableValue(point, context);
+        optionalValue.ifPresent(value -> field.set(instance, value));
     }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java
index 8c21750..7529ee1 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducer.java
@@ -19,10 +19,10 @@ package org.apache.logging.log4j.plugins.defaults.bean;
 
 import org.apache.logging.log4j.plugins.spi.bean.Bean;
 import org.apache.logging.log4j.plugins.spi.bean.BeanManager;
+import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
 import org.apache.logging.log4j.plugins.spi.model.InjectionPoint;
 import org.apache.logging.log4j.plugins.spi.model.MetaField;
 import org.apache.logging.log4j.plugins.spi.model.MetaMethod;
-import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
 
 import java.lang.reflect.Type;
 import java.util.Collection;
@@ -32,7 +32,7 @@ class FieldProducer<P, T> extends AbstractProducer<P, T> {
     private final MetaField<P, T> field;
 
     FieldProducer(final BeanManager beanManager, final Bean<P> producerBean, final MetaField<P, T> field,
-                  final MetaMethod<P, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+                  final MetaMethod<P, ?> disposerMethod, final Collection<InjectionPoint> disposerInjectionPoints) {
         super(beanManager, producerBean, disposerMethod, disposerInjectionPoints);
         this.field = field;
     }
@@ -53,7 +53,7 @@ class FieldProducer<P, T> extends AbstractProducer<P, T> {
     }
 
     @Override
-    public Collection<InjectionPoint<?>> getInjectionPoints() {
+    public Collection<InjectionPoint> getInjectionPoints() {
         return Collections.emptySet();
     }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducerFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducerFactory.java
index 8ac3097..f629a45 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducerFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/FieldProducerFactory.java
@@ -32,7 +32,7 @@ class FieldProducerFactory<D> extends AbstractProducerFactory<D> {
 
     FieldProducerFactory(final BeanManager beanManager, final Bean<D> declaringBean,
                          final MetaField<D, ?> producerField, final MetaMethod<D, ?> disposerMethod,
-                         final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+                         final Collection<InjectionPoint> disposerInjectionPoints) {
         super(declaringBean, producerField, disposerMethod, disposerInjectionPoints);
         this.beanManager = beanManager;
     }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/InjectionTargetBean.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/InjectionTargetBean.java
index d71839a..663ecd4 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/InjectionTargetBean.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/InjectionTargetBean.java
@@ -28,7 +28,7 @@ import org.apache.logging.log4j.plugins.spi.model.Variable;
 import java.util.Collection;
 import java.util.Objects;
 
-class InjectionTargetBean<T> extends AbstractBean<T, T> {
+class InjectionTargetBean<T> extends AbstractBean<T> {
     private final InjectionTarget<T> injectionTarget;
 
     InjectionTargetBean(final Variable variable, final MetaClass<T> declaringClass,
@@ -39,7 +39,7 @@ class InjectionTargetBean<T> extends AbstractBean<T, T> {
     }
 
     @Override
-    public Collection<InjectionPoint<?>> getInjectionPoints() {
+    public Collection<InjectionPoint> getInjectionPoints() {
         return injectionTarget.getInjectionPoints();
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java
index 8b80a4a..8baf1c2 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducer.java
@@ -29,11 +29,11 @@ import java.util.Collection;
 
 class MethodProducer<P, T> extends AbstractProducer<P, T> {
     private final MetaMethod<P, T> producerMethod;
-    private final Collection<InjectionPoint<?>> producerInjectionPoints;
+    private final Collection<InjectionPoint> producerInjectionPoints;
 
     MethodProducer(final BeanManager beanManager, final Bean<P> producerBean,
-                   final MetaMethod<P, T> producerMethod, final Collection<InjectionPoint<?>> producerInjectionPoints,
-                   final MetaMethod<P, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+                   final MetaMethod<P, T> producerMethod, final Collection<InjectionPoint> producerInjectionPoints,
+                   final MetaMethod<P, ?> disposerMethod, final Collection<InjectionPoint> disposerInjectionPoints) {
         super(beanManager, producerBean, disposerMethod, disposerInjectionPoints);
         if (!producerMethod.isStatic() && producerBean == null) {
             throw new DefinitionException("Producer instance method must be in a bean");
@@ -56,7 +56,7 @@ class MethodProducer<P, T> extends AbstractProducer<P, T> {
     }
 
     @Override
-    public Collection<InjectionPoint<?>> getInjectionPoints() {
+    public Collection<InjectionPoint> getInjectionPoints() {
         return producerInjectionPoints;
     }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducerFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducerFactory.java
index 73e4b35..d503cea 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducerFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/MethodProducerFactory.java
@@ -28,11 +28,11 @@ import java.util.Collection;
 
 class MethodProducerFactory<D> extends AbstractProducerFactory<D> {
     private final BeanManager beanManager;
-    private final Collection<InjectionPoint<?>> producerInjectionPoints;
+    private final Collection<InjectionPoint> producerInjectionPoints;
 
     MethodProducerFactory(final BeanManager beanManager, final Bean<D> declaringBean,
-                          final MetaMethod<D, ?> producerMethod, final Collection<InjectionPoint<?>> producerInjectionPoints,
-                          final MetaMethod<D, ?> disposerMethod, final Collection<InjectionPoint<?>> disposerInjectionPoints) {
+                          final MetaMethod<D, ?> producerMethod, final Collection<InjectionPoint> producerInjectionPoints,
+                          final MetaMethod<D, ?> disposerMethod, final Collection<InjectionPoint> disposerInjectionPoints) {
         super(declaringBean, producerMethod, disposerMethod, disposerInjectionPoints);
         this.producerInjectionPoints = producerInjectionPoints;
         this.beanManager = beanManager;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/ProducerBean.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/ProducerBean.java
index 5eea07b..a70f1fd 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/ProducerBean.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/ProducerBean.java
@@ -18,22 +18,22 @@
 package org.apache.logging.log4j.plugins.defaults.bean;
 
 import org.apache.logging.log4j.plugins.spi.IllegalProductException;
+import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
 import org.apache.logging.log4j.plugins.spi.bean.Producer;
 import org.apache.logging.log4j.plugins.spi.bean.ProducerFactory;
 import org.apache.logging.log4j.plugins.spi.model.InjectionPoint;
 import org.apache.logging.log4j.plugins.spi.model.MetaClass;
 import org.apache.logging.log4j.plugins.spi.model.Variable;
-import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
 
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Objects;
 
-class ProducerBean<D, T> extends AbstractBean<D, T> {
+class ProducerBean<T> extends AbstractBean<T> {
     private final Producer<T> producer;
     private final Type type;
 
-    ProducerBean(final Variable variable, final MetaClass<D> declaringClass, final ProducerFactory<D> factory) {
+    ProducerBean(final Variable variable, final MetaClass<?> declaringClass, final ProducerFactory factory) {
         super(variable, declaringClass);
         Objects.requireNonNull(factory);
         producer = factory.createProducer(this);
@@ -49,7 +49,7 @@ class ProducerBean<D, T> extends AbstractBean<D, T> {
     }
 
     @Override
-    public Collection<InjectionPoint<?>> getInjectionPoints() {
+    public Collection<InjectionPoint> getInjectionPoints() {
         return producer.getInjectionPoints();
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/SystemBean.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/SystemBean.java
index 8b55f3d..97cfb94 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/SystemBean.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/SystemBean.java
@@ -17,12 +17,12 @@
 
 package org.apache.logging.log4j.plugins.defaults.bean;
 
-import org.apache.logging.log4j.plugins.spi.model.MetaClass;
 import org.apache.logging.log4j.plugins.spi.bean.Bean;
+import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
+import org.apache.logging.log4j.plugins.spi.model.InjectionPoint;
+import org.apache.logging.log4j.plugins.spi.model.MetaClass;
 import org.apache.logging.log4j.plugins.spi.model.Qualifiers;
 import org.apache.logging.log4j.plugins.spi.model.Variable;
-import org.apache.logging.log4j.plugins.spi.model.InjectionPoint;
-import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
@@ -52,7 +52,7 @@ abstract class SystemBean<T> implements Bean<T> {
     }
 
     @Override
-    public Collection<InjectionPoint<?>> getInjectionPoints() {
+    public Collection<InjectionPoint> getInjectionPoints() {
         return Collections.emptySet();
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaExecutable.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaExecutable.java
index 60a6fb7..e34a5cc 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaExecutable.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaExecutable.java
@@ -26,19 +26,19 @@ import java.lang.reflect.Parameter;
 import java.util.ArrayList;
 import java.util.List;
 
-abstract class AbstractMetaExecutable<D, T> extends AbstractMetaMember<D, T> implements MetaExecutable<D, T> {
-    private final List<MetaParameter<?>> parameters;
+abstract class AbstractMetaExecutable<D, T> extends AbstractMetaMember<D, T> implements MetaExecutable<D> {
+    private final List<MetaParameter> parameters;
 
     AbstractMetaExecutable(final MetaClass<D> declaringClass, final Executable executable, final MetaClass<T> type) {
         super(declaringClass, executable, type);
         parameters = new ArrayList<>(executable.getParameterCount());
         for (final Parameter parameter : executable.getParameters()) {
-            parameters.add(new DefaultMetaParameter<>(parameter));
+            parameters.add(new DefaultMetaParameter(parameter));
         }
     }
 
     @Override
-    public List<MetaParameter<?>> getParameters() {
+    public List<MetaParameter> getParameters() {
         return parameters;
     }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaMember.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaMember.java
index 52dbad2..a7cecdc 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaMember.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/AbstractMetaMember.java
@@ -27,7 +27,7 @@ import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.Collection;
 
-abstract class AbstractMetaMember<D, T> implements MetaMember<D, T> {
+abstract class AbstractMetaMember<D, T> implements MetaMember<D> {
     private final String name;
     private final Collection<MetaAnnotation> annotations;
     private final MetaClass<D> declaringClass;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultElementManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultElementManager.java
index 8193144..b1a4066 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultElementManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultElementManager.java
@@ -90,7 +90,7 @@ public class DefaultElementManager implements ElementManager {
     }
 
     @Override
-    public Qualifiers getQualifiers(final MetaElement<?> element) {
+    public Qualifiers getQualifiers(final MetaElement element) {
         final String elementName = element.getName();
         final String defaultNamedValue;
         if (element instanceof MetaMethod<?, ?>) {
@@ -136,7 +136,7 @@ public class DefaultElementManager implements ElementManager {
         return new DefaultMetaAnnotation(annotationType, elements);
     }
 
-    private Class<? extends Annotation> getScopeType(final MetaElement<?> element) {
+    private Class<? extends Annotation> getScopeType(final MetaElement element) {
         final Collection<Class<? extends Annotation>> scopeTypes = filterScopeTypes(element.getAnnotations());
         return scopeTypes.isEmpty() ? Dependent.class : scopeTypes.iterator().next();
     }
@@ -162,35 +162,35 @@ public class DefaultElementManager implements ElementManager {
     }
 
     @Override
-    public <D, T> InjectionPoint<T> createFieldInjectionPoint(final MetaField<D, T> field, final Bean<D> owner) {
+    public <D> InjectionPoint createFieldInjectionPoint(final MetaField<D, ?> field, final Bean<D> owner) {
         Objects.requireNonNull(field);
         final Qualifiers qualifiers = getQualifiers(field);
-        return new DefaultInjectionPoint<>(field.getType(), qualifiers, owner, field, field);
+        return new DefaultInjectionPoint(field.getType(), qualifiers, owner, field, field);
     }
 
     @Override
-    public <D, P> InjectionPoint<P> createParameterInjectionPoint(final MetaExecutable<D, ?> executable,
-                                                                  final MetaParameter<P> parameter,
-                                                                  final Bean<D> owner) {
+    public <D> InjectionPoint createParameterInjectionPoint(final MetaExecutable<D> executable,
+                                                            final MetaParameter parameter,
+                                                            final Bean<D> owner) {
         Objects.requireNonNull(executable);
         Objects.requireNonNull(parameter);
         final Qualifiers qualifiers = getQualifiers(parameter);
-        return new DefaultInjectionPoint<>(parameter.getType(), qualifiers, owner, executable, parameter);
+        return new DefaultInjectionPoint(parameter.getType(), qualifiers, owner, executable, parameter);
     }
 
     @Override
-    public Variable createVariable(final MetaElement<?> element) {
+    public Variable createVariable(final MetaElement element) {
         Objects.requireNonNull(element);
         return createVariable(element, getQualifiers(element));
     }
 
     @Override
-    public Variable createVariable(final InjectionPoint<?> point) {
+    public Variable createVariable(final InjectionPoint point) {
         Objects.requireNonNull(point);
         return createVariable(point.getElement(), point.getQualifiers());
     }
 
-    private Variable createVariable(final MetaElement<?> element, final Qualifiers qualifiers) {
+    private Variable createVariable(final MetaElement element, final Qualifiers qualifiers) {
         final Collection<Type> types = element.getTypeClosure();
         final Class<? extends Annotation> scopeType = getScopeType(element);
         return DefaultVariable.newVariable(types, qualifiers, scopeType);
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultInjectionPoint.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultInjectionPoint.java
index c79405c..eba0996 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultInjectionPoint.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultInjectionPoint.java
@@ -27,15 +27,15 @@ import java.lang.reflect.Type;
 import java.util.Objects;
 import java.util.Optional;
 
-class DefaultInjectionPoint<T> implements InjectionPoint<T> {
+class DefaultInjectionPoint implements InjectionPoint {
     private final Type type;
     private final Qualifiers qualifiers;
     private final Bean<?> bean;
-    private final MetaMember<?, ?> member;
-    private final MetaElement<T> element;
+    private final MetaMember<?> member;
+    private final MetaElement element;
 
     DefaultInjectionPoint(final Type type, final Qualifiers qualifiers, final Bean<?> bean,
-                          final MetaMember<?, ?> member, final MetaElement<T> element) {
+                          final MetaMember<?> member, final MetaElement element) {
         this.type = type;
         this.qualifiers = qualifiers;
         this.bean = bean;
@@ -59,12 +59,12 @@ class DefaultInjectionPoint<T> implements InjectionPoint<T> {
     }
 
     @Override
-    public MetaMember<?, ?> getMember() {
+    public MetaMember<?> getMember() {
         return member;
     }
 
     @Override
-    public MetaElement<T> getElement() {
+    public MetaElement getElement() {
         return element;
     }
 
@@ -72,7 +72,7 @@ class DefaultInjectionPoint<T> implements InjectionPoint<T> {
     public boolean equals(final Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
-        final DefaultInjectionPoint<?> that = (DefaultInjectionPoint<?>) o;
+        final DefaultInjectionPoint that = (DefaultInjectionPoint) o;
         return qualifiers.equals(that.qualifiers) &&
                 Objects.equals(bean, that.bean) &&
                 member.equals(that.member) &&
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaAnnotationElement.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaAnnotationElement.java
index acd3e48..ce436c0 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaAnnotationElement.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaAnnotationElement.java
@@ -19,7 +19,6 @@ package org.apache.logging.log4j.plugins.defaults.model;
 
 import org.apache.logging.log4j.plugins.spi.model.MetaAnnotation;
 import org.apache.logging.log4j.plugins.spi.model.MetaAnnotationElement;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 
 import java.lang.reflect.Type;
 import java.util.Collection;
@@ -48,11 +47,6 @@ class DefaultMetaAnnotationElement<T> implements MetaAnnotationElement<T> {
     }
 
     @Override
-    public Collection<Type> getTypeClosure() {
-        return TypeUtil.getTypeClosure(getType());
-    }
-
-    @Override
     public Collection<MetaAnnotation> getAnnotations() {
         return annotations;
     }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaParameter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaParameter.java
index 2b7af20..e581fa4 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaParameter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/model/DefaultMetaParameter.java
@@ -20,22 +20,20 @@ package org.apache.logging.log4j.plugins.defaults.model;
 import org.apache.logging.log4j.plugins.spi.model.MetaAnnotation;
 import org.apache.logging.log4j.plugins.spi.model.MetaClass;
 import org.apache.logging.log4j.plugins.spi.model.MetaParameter;
-import org.apache.logging.log4j.plugins.util.TypeUtil;
 
 import java.lang.reflect.Parameter;
 import java.lang.reflect.Type;
 import java.util.Collection;
 
-class DefaultMetaParameter<T> implements MetaParameter<T> {
+class DefaultMetaParameter implements MetaParameter {
     private final String name;
-    private final MetaClass<T> parameterClass;
+    private final MetaClass<?> parameterClass;
     private final String toString;
 
     DefaultMetaParameter(final Parameter parameter) {
         name = parameter.getName();
-        final Type type = parameter.getParameterizedType();
-        final Class<T> javaClass = TypeUtil.cast(parameter.getType());
-        parameterClass = DefaultMetaClass.newMetaClass(type, javaClass, parameter.getAnnotations());
+        parameterClass = DefaultMetaClass.newMetaClass(
+                parameter.getParameterizedType(), parameter.getType(), parameter.getAnnotations());
         toString = parameter.toString();
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/UnsatisfiedBeanException.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/UnsatisfiedBeanException.java
index 3b17bf6..2fc2dff 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/UnsatisfiedBeanException.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/UnsatisfiedBeanException.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.plugins.spi.model.InjectionPoint;
 import java.lang.reflect.Type;
 
 public class UnsatisfiedBeanException extends ResolutionException {
-    public UnsatisfiedBeanException(final InjectionPoint<?> point) {
+    public UnsatisfiedBeanException(final InjectionPoint point) {
         super("No beans found for " + point);
     }
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Bean.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Bean.java
index 482aeec..4950ac8 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Bean.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Bean.java
@@ -42,7 +42,7 @@ public interface Bean<T> extends Variable {
      */
     void destroy(final T instance, final InitializationContext<T> context);
 
-    Collection<InjectionPoint<?>> getInjectionPoints();
+    Collection<InjectionPoint> getInjectionPoints();
 
     // for a managed bean: that class
     // for a producer field or producer method: the declaring class
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java
index a66d1b1..acd772e 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/BeanManager.java
@@ -86,7 +86,7 @@ public interface BeanManager extends AutoCloseable {
      * @param <T>           type of injectable value
      * @return value to inject if defined or empty otherwise
      */
-    <T> Optional<T> getInjectableValue(final InjectionPoint<T> point, final InitializationContext<?> parentContext);
+    <T> Optional<T> getInjectableValue(final InjectionPoint point, final InitializationContext<?> parentContext);
 
     @Override
     void close();
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java
index a2c0c4f..e803790 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Injector.java
@@ -25,19 +25,19 @@ import org.apache.logging.log4j.plugins.spi.model.MetaMethod;
 import java.util.Collection;
 
 public interface Injector {
-    <T> T construct(final MetaConstructor<T> constructor, final Collection<InjectionPoint<?>> points,
+    <T> T construct(final MetaConstructor<T> constructor, final Collection<InjectionPoint> points,
                     final InitializationContext<T> context);
 
     <D, T> T produce(final D producerInstance, final MetaMethod<D, T> producerMethod,
-                     final Collection<InjectionPoint<?>> points, final InitializationContext<D> context);
+                     final Collection<InjectionPoint> points, final InitializationContext<D> context);
 
     <T> void dispose(final T disposerInstance, final MetaMethod<T, ?> disposerMethod,
-                     final Collection<InjectionPoint<?>> points, final Object instance,
+                     final Collection<InjectionPoint> points, final Object instance,
                      final InitializationContext<T> context);
 
-    <T> void invoke(final T instance, final MetaMethod<T, ?> method, final Collection<InjectionPoint<?>> points,
+    <T> void invoke(final T instance, final MetaMethod<T, ?> method, final Collection<InjectionPoint> points,
                     final InitializationContext<T> context);
 
-    <D, T> void set(final D instance, final MetaField<D, T> field, final InjectionPoint<T> point,
+    <D, T> void set(final D instance, final MetaField<D, T> field, final InjectionPoint point,
                     final InitializationContext<D> context);
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Producer.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Producer.java
index 4a8f27a..b598f46 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Producer.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/Producer.java
@@ -33,5 +33,5 @@ public interface Producer<T> {
 
     // for a class: injected fields, @Inject constructor parameters, and initializer method params
     // for a producer method: method params
-    Collection<InjectionPoint<?>> getInjectionPoints();
+    Collection<InjectionPoint> getInjectionPoints();
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/ProducerFactory.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/ProducerFactory.java
index c266224..29e0684 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/ProducerFactory.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/bean/ProducerFactory.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.plugins.spi.bean;
 
-public interface ProducerFactory<D> {
+public interface ProducerFactory {
     // only time bean is null is static @Produces potentially?
     <T> Producer<T> createProducer(final Bean<T> bean);
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/ElementManager.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/ElementManager.java
index ee213c3..32d94e2 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/ElementManager.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/ElementManager.java
@@ -53,7 +53,7 @@ public interface ElementManager extends AutoCloseable {
      * @param element program element to extract qualifiers from
      * @return qualifiers present on the element
      */
-    Qualifiers getQualifiers(MetaElement<?> element);
+    Qualifiers getQualifiers(MetaElement element);
 
     /**
      * Checks if a class has exactly one injectable constructor. A constructor is <i>injectable</i> if:
@@ -98,7 +98,7 @@ public interface ElementManager extends AutoCloseable {
      * @param element field, method, or parameter to check
      * @return true if the element is injectable or false otherwise
      */
-    default boolean isInjectable(final MetaElement<?> element) {
+    default boolean isInjectable(final MetaElement element) {
         return element.isAnnotationPresent(Inject.class) ||
                 (element.getAnnotations().stream().map(MetaAnnotation::getAnnotationType).anyMatch(this::isQualifierType) &&
                         !element.isAnnotationPresent(Produces.class));
@@ -110,10 +110,9 @@ public interface ElementManager extends AutoCloseable {
      * @param field field where injection will take place
      * @param owner bean where field is located or null for static fields
      * @param <D>   bean type
-     * @param <T>   field type
      * @return an injection point describing the field
      */
-    <D, T> InjectionPoint<T> createFieldInjectionPoint(final MetaField<D, T> field, final Bean<D> owner);
+    <D> InjectionPoint createFieldInjectionPoint(final MetaField<D, ?> field, final Bean<D> owner);
 
     /**
      * Creates an injection point for a method or constructor parameter with an optional owning bean.
@@ -122,11 +121,10 @@ public interface ElementManager extends AutoCloseable {
      * @param parameter  which parameter of that executable to create a point at
      * @param owner      bean where executable is located or null for static methods
      * @param <D>        bean type
-     * @param <P>        parameter type
      * @return an injection point describing the parameter
      */
-    <D, P> InjectionPoint<P> createParameterInjectionPoint(final MetaExecutable<D, ?> executable,
-                                                           final MetaParameter<P> parameter, final Bean<D> owner);
+    <D> InjectionPoint createParameterInjectionPoint(final MetaExecutable<D> executable,
+                                                     final MetaParameter parameter, final Bean<D> owner);
 
     /**
      * Creates a collection of injection points for all the parameters of a method or constructor with an optional
@@ -137,7 +135,7 @@ public interface ElementManager extends AutoCloseable {
      * @param <D>        bean type
      * @return collection of injection points describing the executable parameters
      */
-    default <D> Collection<InjectionPoint<?>> createExecutableInjectionPoints(final MetaExecutable<D, ?> executable, final Bean<D> owner) {
+    default <D> Collection<InjectionPoint> createExecutableInjectionPoints(final MetaExecutable<D> executable, final Bean<D> owner) {
         Objects.requireNonNull(executable);
         return executable.getParameters().stream()
                 .map(parameter -> createParameterInjectionPoint(executable, parameter, owner))
@@ -147,12 +145,12 @@ public interface ElementManager extends AutoCloseable {
     /**
      * Creates a variable for an element.
      */
-    Variable createVariable(final MetaElement<?> element);
+    Variable createVariable(final MetaElement element);
 
     /**
      * Creates a variable for an injection point.
      */
-    Variable createVariable(final InjectionPoint<?> point);
+    Variable createVariable(final InjectionPoint point);
 
     @Override
     void close();
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/InjectionPoint.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/InjectionPoint.java
index 6e47521..05e09db 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/InjectionPoint.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/InjectionPoint.java
@@ -24,10 +24,8 @@ import java.util.Optional;
 
 /**
  * Represents metadata about an element in a program where a value should be injected.
- *
- * @param <T> type of element
  */
-public interface InjectionPoint<T> {
+public interface InjectionPoint {
 
     /**
      * Gets the generic type information of this point.
@@ -48,11 +46,11 @@ public interface InjectionPoint<T> {
     /**
      * Gets the field, method, or constructor where injection takes place.
      */
-    MetaMember<?, ?> getMember();
+    MetaMember<?> getMember();
 
     /**
      * Gets the program element corresponding to this injection point.
      */
-    MetaElement<T> getElement();
+    MetaElement getElement();
 
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaAnnotationElement.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaAnnotationElement.java
index 28506fe..460d6b8 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaAnnotationElement.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaAnnotationElement.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.plugins.spi.model;
 
-public interface MetaAnnotationElement<T> extends MetaElement<T> {
+public interface MetaAnnotationElement<T> extends MetaElement {
     T getValue();
 
     MetaAnnotationElement<T> withNewValue(final T value);
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaClass.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaClass.java
index 48159bf..7d3b4d9 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaClass.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaClass.java
@@ -23,7 +23,7 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Optional;
 
-public interface MetaClass<T> extends MetaElement<T> {
+public interface MetaClass<T> extends MetaElement {
     Class<T> getJavaClass();
 
     Collection<MetaConstructor<T>> getConstructors();
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaConstructor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaConstructor.java
index 766d353..4402259 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaConstructor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaConstructor.java
@@ -17,6 +17,6 @@
 
 package org.apache.logging.log4j.plugins.spi.model;
 
-public interface MetaConstructor<T> extends MetaExecutable<T, T> {
+public interface MetaConstructor<T> extends MetaExecutable<T> {
     T construct(final Object... args);
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaElement.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaElement.java
index dec4495..4ebe48c 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaElement.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaElement.java
@@ -18,12 +18,13 @@
 package org.apache.logging.log4j.plugins.spi.model;
 
 import org.apache.logging.log4j.plugins.api.AnnotationAlias;
+import org.apache.logging.log4j.plugins.util.TypeUtil;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
 
-public interface MetaElement<T> {
+public interface MetaElement {
 
     /**
      * Returns the source code name of this element.
@@ -32,7 +33,9 @@ public interface MetaElement<T> {
 
     Type getType();
 
-    Collection<Type> getTypeClosure();
+    default Collection<Type> getTypeClosure() {
+        return TypeUtil.getTypeClosure(getType());
+    }
 
     /**
      * Returns all the annotations present on this element.
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaExecutable.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaExecutable.java
index b2ae5e1..049cf21 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaExecutable.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaExecutable.java
@@ -19,6 +19,6 @@ package org.apache.logging.log4j.plugins.spi.model;
 
 import java.util.List;
 
-public interface MetaExecutable<D, T> extends MetaMember<D, T> {
-    List<MetaParameter<?>> getParameters();
+public interface MetaExecutable<T> extends MetaMember<T> {
+    List<MetaParameter> getParameters();
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaField.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaField.java
index 9767eba..a406a96 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaField.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaField.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.plugins.spi.model;
 
-public interface MetaField<D, T> extends MetaMember<D, T> {
+public interface MetaField<D, T> extends MetaMember<D> {
     T get(final D target);
 
     void set(final D target, final T value);
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMember.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMember.java
index b718867..4fc34a4 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMember.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMember.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.plugins.spi.model;
 
-public interface MetaMember<D, T> extends MetaElement<T> {
+public interface MetaMember<D> extends MetaElement {
     MetaClass<D> getDeclaringClass();
 
     boolean isStatic();
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMethod.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMethod.java
index 80989b8..7e79f89 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMethod.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaMethod.java
@@ -17,6 +17,6 @@
 
 package org.apache.logging.log4j.plugins.spi.model;
 
-public interface MetaMethod<D, T> extends MetaExecutable<D, T> {
+public interface MetaMethod<D, T> extends MetaExecutable<D> {
     T invoke(final D target, final Object... args);
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaParameter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaParameter.java
index cac9b58..9ceaef0 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaParameter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/spi/model/MetaParameter.java
@@ -17,5 +17,5 @@
 
 package org.apache.logging.log4j.plugins.spi.model;
 
-public interface MetaParameter<T> extends MetaElement<T> {
+public interface MetaParameter extends MetaElement {
 }
diff --git a/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java
index 06a07bf..7376ab7 100644
--- a/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java
+++ b/log4j-plugins/src/test/java/org/apache/logging/log4j/plugins/test/BeanJUnit4Runner.java
@@ -123,7 +123,7 @@ public class BeanJUnit4Runner extends BlockJUnit4ClassRunner {
                     final Class<T> testClass = TypeUtil.cast(getTestClass().getJavaClass());
                     final MetaClass<T> metaClass = elementManager.getMetaClass(testClass);
                     final MetaMethod<T, Void> metaMethod = metaClass.getMetaMethod(method.getMethod());
-                    final Collection<InjectionPoint<?>> points =
+                    final Collection<InjectionPoint> points =
                             elementManager.createExecutableInjectionPoints(metaMethod, testClassBean);
                     injector.invoke(testInstance, metaMethod, points, context);
                 } finally {