/** @noinspection UnusedDeclaration*/
interface Matcher<T> {

    boolean matches(java.lang.Object object);

    void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}

interface ArgumentConstraintPhrases {
    <error descr="'with(Matcher<T>)' clashes with 'with(Matcher<Boolean>)'; both methods have same erasure"><T> T with(Matcher<T> matcher);</error>
    boolean with(Matcher<Boolean> matcher);
    byte with(Matcher<Byte> matcher);
    short with(Matcher<Short> matcher);
    int with(Matcher<Integer> matcher);
    long with(Matcher<Long> matcher);
    float with(Matcher<Float> matcher);
    double with(Matcher<Double> matcher);
}

class ExpectationGroupBuilder implements ArgumentConstraintPhrases {

    <error descr="'with(Matcher<T>)' clashes with 'with(Matcher<Boolean>)'; both methods have same erasure">public <T> T with(final Matcher<T> matcher)</error> {
        return null;
    }

    public boolean with(final Matcher<Boolean> matcher) {
        return false;
    }

    public byte with(final Matcher<Byte> matcher) {
        return 0;
    }

    public short with(final Matcher<Short> matcher) {
        return 0;
    }

    public int with(final Matcher<Integer> matcher) {
        return 0;
    }

    public long with(final Matcher<Long> matcher) {
        return 0;
    }

    public float with(final Matcher<Float> matcher) {
        return 0;
    }

    public double with(final Matcher<Double> matcher) {
        return 0;
    }
}
