@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof ParameterizedTypeInformation)) { return false; } ParameterizedTypeInformation<?> that = (ParameterizedTypeInformation<?>) obj; if (this.isResolvedCompletely() && that.isResolvedCompletely()) { return this.type.equals(that.type); } return super.equals(obj); }
@Override @SuppressWarnings("unchecked") public TypeInformation<? extends T> specialize(ClassTypeInformation<?> type) { return isResolvedCompletely() ? (TypeInformation<? extends T>) type : super.specialize(type); }
@Override public int hashCode() { return super.hashCode() + (isResolvedCompletely() ? this.type.hashCode() : 0); }
private boolean isResolvedCompletely() { Type[] types = type.getActualTypeArguments(); if (types.length == 0) { return false; } for (Type type : types) { TypeInformation<?> info = createInfo(type); if (info instanceof ParameterizedTypeInformation) { if (!((ParameterizedTypeInformation<?>) info).isResolvedCompletely()) { return false; } } if (!(info instanceof ClassTypeInformation)) { return false; } } return true; } }
private boolean isResolvedCompletely() { Type[] typeArguments = type.getActualTypeArguments(); if (typeArguments.length == 0) { return false; } for (Type typeArgument : typeArguments) { TypeInformation<?> info = createInfo(typeArgument); if (info instanceof ParameterizedTypeInformation) { if (!((ParameterizedTypeInformation<?>) info).isResolvedCompletely()) { return false; } } if (!(info instanceof ClassTypeInformation)) { return false; } } return true; }
/** * Creates a new {@link ParameterizedTypeInformation} for the given {@link Type} and parent {@link TypeDiscoverer}. * * @param type must not be {@literal null} * @param parent must not be {@literal null} */ public ParameterizedTypeInformation(ParameterizedType type, TypeDiscoverer<?> parent) { super(type, parent, calculateTypeVariables(type, parent)); this.type = type; this.resolved = Lazy.of(() -> isResolvedCompletely()); }