+++ /dev/null
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed 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 io.atomix.utils;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-
-/**
- * Generics utility.
- */
-public class Generics {
-
- /**
- * Returns the generic type at the given position for the given class.
- *
- * @param instance the implementing instance
- * @param clazz the generic class
- * @param position the generic position
- * @return the generic type at the given position
- */
- public static Type getGenericClassType(Object instance, Class<?> clazz, int position) {
- Class<?> type = instance.getClass();
- while (type != Object.class) {
- if (type.getGenericSuperclass() instanceof ParameterizedType) {
- ParameterizedType genericSuperclass = (ParameterizedType) type.getGenericSuperclass();
- if (genericSuperclass.getRawType() == clazz) {
- return genericSuperclass.getActualTypeArguments()[position];
- } else {
- type = type.getSuperclass();
- }
- } else {
- type = type.getSuperclass();
- }
- }
- return null;
- }
-
- /**
- * Returns the generic type at the given position for the given interface.
- *
- * @param instance the implementing instance
- * @param iface the generic interface
- * @param position the generic position
- * @return the generic type at the given position
- */
- public static Type getGenericInterfaceType(Object instance, Class<?> iface, int position) {
- Class<?> type = instance.getClass();
- while (type != Object.class) {
- for (Type genericType : type.getGenericInterfaces()) {
- if (genericType instanceof ParameterizedType) {
- ParameterizedType parameterizedType = (ParameterizedType) genericType;
- if (parameterizedType.getRawType() == iface) {
- return parameterizedType.getActualTypeArguments()[position];
- }
- }
- }
- type = type.getSuperclass();
- }
- return null;
- }
-
- private Generics() {
- }
-}
+++ /dev/null
-/*
- * Copyright 2018-present Open Networking Foundation
- *
- * Licensed 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 io.atomix.utils;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Generics test.
- */
-public class GenericsTest {
- @Test
- public void testGetInterfaceType() throws Exception {
- assertEquals(String.class, Generics.getGenericInterfaceType(new ConcreteInterface(), GenericInterface.class, 0));
- assertEquals(SomeClass.class, Generics.getGenericInterfaceType(new ConcreteInterface(), GenericInterface.class, 1));
- }
-
- @Test
- public void testGetClassType() throws Exception {
- assertEquals(SomeClass.class, Generics.getGenericClassType(new ConcreteClass(), GenericClass.class, 0));
- }
-
- public interface GenericInterface<T1, T2> {
- T1 type1();
-
- T2 type2();
- }
-
- public static class ConcreteInterface implements GenericInterface<String, SomeClass> {
- @Override
- public String type1() {
- return null;
- }
-
- @Override
- public SomeClass type2() {
- return null;
- }
- }
-
- public abstract class GenericClass<T> {
- public abstract T type();
- }
-
- public class ConcreteClass extends GenericClass<SomeClass> {
- @Override
- public SomeClass type() {
- return null;
- }
- }
-
- public class SomeClass {
- }
-}