/*
 * Copyright (C) 2020 The Dagger 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.
 */

package dagger.hilt.internal;

/** Runtime utility method for performing a casting in generated code. */
public final class UnsafeCasts {

  // Only used where code generations makes it safe.
  @SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
  public static <T> T unsafeCast(Object obj) {
    return (T) obj;
  }

  private UnsafeCasts() {}
}
