package openmods.utils; import com.google.common.base.Preconditions; public class Variant { // TODO maybe capture type somehow? public abstract static class Selector<T> { public abstract T cast(Object o); } public static <T> Selector<T> createSelector() { return new Selector<T>() { @Override @SuppressWarnings("unchecked") public T cast(Object o) { return (T)o; } }; } private final Selector<?> type; private final Object payload; public <T> Variant(Selector<? super T> type, T payload) { this.type = type; this.payload = payload; } public boolean is(Selector<?> type) { return this.type == type; } public <T> T get(Selector<T> type) { Preconditions.checkArgument(this.type == type); return type.cast(payload); } }