@SuppressWarnings("unchecked") public static <T> Equality<T> of(Class<T> clazz, T thiz, Object obj) { if (Arguments.mustNotBeNull("thiz", thiz) == obj) { return new Equality<>(true); } if (obj == null) { return new Equality<>(false); } Class<? extends Object> thisClass = thiz.getClass(); Arguments.mustBeInstanceOfOther("thisObj", thiz, "clazz", clazz); Class<? extends Object> objectClass = obj.getClass(); if (thisClass == objectClass) { return new Equality<>((T)obj); } if (!clazz.isAssignableFrom(objectClass)) { return new Equality<>(false); } Class<?>[] expectedOETypes = Equality.getOETypes(thisClass); Class<?>[] actualOETypes = Equality.getOETypes(objectClass); if (expectedOETypes.length != actualOETypes.length) { return new Equality<>(false); } for (int i = expectedOETypes.length - 1; i >= 0; i--) { if (expectedOETypes[i] != actualOETypes[i]) { return new Equality<>(false); } } return new Equality<>((T)obj); }