/*
 * Copyright 2020 The JSpecify Authors.
 *
 * 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.
 */
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

@NullMarked
class OverrideParametersThatAreTypeVariables {
  interface Super<E extends @Nullable Object> {
    void useE(E e);

    <F extends E> void useF(F f);

    void useLibE(Lib<E> e);

    <F extends E> void useLibF(Lib<F> f);

    void useArrayOfE(E[] e);

    <F extends E> void useArrayOfF(F[] f);
  }

  interface Sub<T extends @Nullable Object> extends Super<T> {
    @Override
    void useE(T e);

    @Override
    <U extends T> void useF(U f);

    @Override
    void useLibE(Lib<T> e);

    @Override
    <U extends T> void useLibF(Lib<U> f);

    @Override
    void useArrayOfE(T[] e);

    @Override
    <U extends T> void useArrayOfF(U[] f);
  }

  interface Lib<T extends @Nullable Object> {}
}
