A generic interface lets one public name dispatch to different module procedures based on argument types.

Program

Play the program to call double_value with an integer and with a real value.

generic_interface.f90
module generic_math
    implicit none
    interface double_value
        module procedure double_integer
        module procedure double_real
    end interface
contains
    function double_integer(value) result(out)
        integer, intent(in) :: value
        integer :: out
        out = value * 2
    end function double_integer
    function double_real(value) result(out)
        real, intent(in) :: value
        real :: out
        out = value * 2.0
    end function double_real
end module generic_math

program generic_interface_demo
    use generic_math
    implicit none
    integer :: count
    real :: length, result_real
    integer :: result_int

    count = 
    length = 1.5
    result_int = double_value(count)
    result_real = double_value(length)
    print '(I0, A, F0.1)', result_int, " ", result_real
end program generic_interface_demo
module generic_math
    implicit none
    interface double_value
        module procedure double_integer
        module procedure double_real
    end interface
contains
    function double_integer(value) result(out)
        integer, intent(in) :: value
        integer :: out
        out = value * 2
    end function double_integer
    function double_real(value) result(out)
        real, intent(in) :: value
        real :: out
        out = value * 2.0
    end function double_real
end module generic_math

program generic_interface_demo
    use generic_math
    implicit none
    integer :: count
    real :: length, result_real
    integer :: result_int

    count = 
    length = 1.5
    result_int = double_value(count)
    result_real = double_value(length)
    print '(I0, A, F0.1)', result_int, " ", result_real
end program generic_interface_demo
module generic_math
    implicit none
    interface double_value
        module procedure double_integer
        module procedure double_real
    end interface
contains
    function double_integer(value) result(out)
        integer, intent(in) :: value
        integer :: out
        out = value * 2
    end function double_integer
    function double_real(value) result(out)
        real, intent(in) :: value
        real :: out
        out = value * 2.0
    end function double_real
end module generic_math

program generic_interface_demo
    use generic_math
    implicit none
    integer :: count
    real :: length, result_real
    integer :: result_int

    count = 
    length = 1.5
    result_int = double_value(count)
    result_real = double_value(length)
    print '(I0, A, F0.1)', result_int, " ", result_real
end program generic_interface_demo
generic interface `interface double_value` groups procedures under one callable name.
module procedure `module procedure` lists the concrete procedures behind the generic name.
type dispatch The argument type selects the integer or real procedure.