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.

count
generic_interface.f90
Replay: real traced execution (multi-file project)
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 = 4
    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 = 6
    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 = 8
    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
  1. count ← 4

    27count = 428length = 1.5
    values this step4count
  2. length ← 1.5

    27count = 428length = 1.529result_int = double_value(count)
    values this step1.5length
  3. result_int ← 8

    28length = 1.529result_int = double_value(count)30result_real = double_value(length)
    values this step8result_int4count
  4. result_real ← 3.0

    29result_int = double_value(count)30result_real = double_value(length)31print '(I0, A, F0.1)', result_int, " ", result_real
    values this step3.0result_real1.5length
  5. print '(I0, A, F0.1)', result_int, " ", result_real

    30    result_real = double_value(length)31    print '(I0, A, F0.1)', result_int, " ", result_real32end program generic_interface_demo
    output8 3.0
    values this step8result_int3.0result_real
  1. count ← 6

    27count = 628length = 1.5
    values this step6count
  2. length ← 1.5

    27count = 628length = 1.529result_int = double_value(count)
    values this step1.5length
  3. result_int ← 12

    28length = 1.529result_int = double_value(count)30result_real = double_value(length)
    values this step12result_int6count
  4. result_real ← 3.0

    29result_int = double_value(count)30result_real = double_value(length)31print '(I0, A, F0.1)', result_int, " ", result_real
    values this step3.0result_real1.5length
  5. print '(I0, A, F0.1)', result_int, " ", result_real

    30    result_real = double_value(length)31    print '(I0, A, F0.1)', result_int, " ", result_real32end program generic_interface_demo
    output12 3.0
    values this step12result_int3.0result_real
  1. count ← 8

    27count = 828length = 1.5
    values this step8count
  2. length ← 1.5

    27count = 828length = 1.529result_int = double_value(count)
    values this step1.5length
  3. result_int ← 16

    28length = 1.529result_int = double_value(count)30result_real = double_value(length)
    values this step16result_int8count
  4. result_real ← 3.0

    29result_int = double_value(count)30result_real = double_value(length)31print '(I0, A, F0.1)', result_int, " ", result_real
    values this step3.0result_real1.5length
  5. print '(I0, A, F0.1)', result_int, " ", result_real

    30    result_real = double_value(length)31    print '(I0, A, F0.1)', result_int, " ", result_real32end program generic_interface_demo
    output16 3.0
    values this step16result_int3.0result_real
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.