Fixed issues with getting generic parameter names to support lambda
expressions
This commit is contained in:
parent
ffc2375fe8
commit
f8de99df31
|
@ -32,6 +32,7 @@ import dorkbox.network.connection.listenerManagement.OnIdleManager;
|
|||
import dorkbox.network.connection.listenerManagement.OnMessageReceivedManager;
|
||||
import dorkbox.util.ClassHelper;
|
||||
import dorkbox.util.Property;
|
||||
import dorkbox.util.TypeResolver;
|
||||
import dorkbox.util.collections.ConcurrentEntry;
|
||||
|
||||
// .equals() compares the identity on purpose,this because we cannot create two separate objects that are somehow equal to each other.
|
||||
|
@ -124,23 +125,12 @@ class ConnectionManager<C extends Connection> implements Listeners, ISessionMana
|
|||
throw new IllegalArgumentException("listener cannot be null.");
|
||||
}
|
||||
|
||||
// find the class that uses Listener.class.
|
||||
Class<?> clazz = listener.getClass();
|
||||
|
||||
// Class<?>[] interfaces = clazz.getInterfaces();
|
||||
// for (Class<?> anInterface : interfaces) {
|
||||
// }
|
||||
//
|
||||
// while (!(clazz.getSuperclass() != Object.class)) {
|
||||
// clazz = clazz.getSuperclass();
|
||||
// }
|
||||
|
||||
// this is the connection generic parameter for the listener
|
||||
Class<?> genericClass = ClassHelper.getGenericParameterAsClassForSuperClass(clazz, 0);
|
||||
// this is the connection generic parameter for the listener, works for lambda expressions as well
|
||||
Class<?> genericClass = ClassHelper.getGenericParameterAsClassForSuperClass(Listener.class, listener.getClass(), 0);
|
||||
|
||||
// if we are null, it means that we have no generics specified for our listener!
|
||||
//noinspection IfStatementWithIdenticalBranches
|
||||
if (genericClass == this.baseClass || genericClass == null) {
|
||||
if (genericClass == this.baseClass || genericClass == TypeResolver.Unknown.class || genericClass == null) {
|
||||
// we are the base class, so we are fine.
|
||||
addListener0(listener);
|
||||
return this;
|
||||
|
|
|
@ -15,9 +15,19 @@
|
|||
*/
|
||||
package dorkbox.network.connection.listenerManagement;
|
||||
|
||||
import static dorkbox.util.collections.ConcurrentIterator.headREF;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import com.esotericsoftware.kryo.util.IdentityMap;
|
||||
|
||||
import dorkbox.network.connection.Connection;
|
||||
import dorkbox.network.connection.ConnectionManager;
|
||||
import dorkbox.network.connection.Listener;
|
||||
import dorkbox.network.connection.Listener.OnError;
|
||||
import dorkbox.network.connection.Listener.OnMessageReceived;
|
||||
import dorkbox.network.connection.Listener.SelfDefinedType;
|
||||
|
@ -25,13 +35,6 @@ import dorkbox.network.rmi.RmiMessages;
|
|||
import dorkbox.util.ClassHelper;
|
||||
import dorkbox.util.collections.ConcurrentEntry;
|
||||
import dorkbox.util.collections.ConcurrentIterator;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
|
||||
|
||||
import static dorkbox.util.collections.ConcurrentIterator.headREF;
|
||||
|
||||
/**
|
||||
* Called when the remote end has been connected. This will be invoked before any objects are received by the network.
|
||||
|
@ -297,14 +300,15 @@ class OnMessageReceivedManager<C extends Connection> {
|
|||
* This works for compile time code. The generic type parameter #2 (index 1) is pulled from type arguments.
|
||||
* generic parameters cannot be primitive types
|
||||
*/
|
||||
private static Class<?> identifyType(final Object listener) {
|
||||
private static
|
||||
Class<?> identifyType(final OnMessageReceived listener) {
|
||||
final Class<?> clazz = listener.getClass();
|
||||
Class<?> objectType = ClassHelper.getGenericParameterAsClassForSuperClass(clazz, 1);
|
||||
Class<?> objectType = ClassHelper.getGenericParameterAsClassForSuperClass(Listener.OnMessageReceived.class, clazz, 1);
|
||||
|
||||
if (objectType != null) {
|
||||
// SOMETIMES generics get confused on which parameter we actually mean (when sub-classing)
|
||||
if (objectType != Object.class && ClassHelper.hasInterface(Connection.class, objectType)) {
|
||||
Class<?> objectType2 = ClassHelper.getGenericParameterAsClassForSuperClass(clazz, 2);
|
||||
Class<?> objectType2 = ClassHelper.getGenericParameterAsClassForSuperClass(Listener.OnMessageReceived.class, clazz, 2);
|
||||
if (objectType2 != null) {
|
||||
objectType = objectType2;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user