簡體   English   中英

埃菲爾鐵塔:編譯錯誤`分配源與目標不兼容`

[英]Eiffel: compilation error `Source of assignment is not compatible with target`

在編譯器中設置了完全無效檢查后,在以下情況下,我得到了一個變量未正確設置編譯錯誤,這對我來說是對的(在我看來)。 它說分配的來源與目標不兼容。 我在這里想念什么??? DB_SERVICE.load_from_primary_key...

在此處輸入圖片說明

類DB_SERVICE

deferred class
    DB_SERVICE [G -> DB_ENTITY create make_from_db_result end]

inherit
    ACTION
        redefine
            start,
            execute
        end

    LOGGABLE
        rename
            make as make_from_loggable
        end

feature -- Creation

    make (a_db_connection: attached DB_CONNECTION)
        require
            valid_db_connection: a_db_connection.is_connected
        do
            make_from_loggable
            db_connection := a_db_connection
            create last_items.make (100)
            create last_column_names.make_empty
        ensure
            db_connection_setted: a_db_connection = db_connection and db_connection.is_connected
        end

feature -- Access

    item: detachable G

    db_connection: DB_CONNECTION

    last_items: HASH_TABLE[like item, INTEGER] -- content of last resultset

    last_column_names: ARRAY[STRING] -- Column names of last resultset

feature -- status_report


    load_from_primary_key (primary_key: INTEGER)
            -- Loads given item into item otherwise item will be Void
        require
            attached db_connection.base_selection
        local
            l_db_result: DB_RESULT
        do
            if attached db_connection.base_selection as bs then
                bs.query ("SELECT * FROM " + ({attached like item}).out + " WHERE " + {attached like item}.Primary_key_db_column_name + "=" + primary_key.out)
                if bs.is_ok then
                    bs.load_result
                    create item.make_from_db_result(last_column_names, bs.cursor)
                else
                    item := Void --HERE is the compiler complaining!
                    logger.write_critical ("Error while retreiving " + ({like item}).out + " from DB")
                end
            else
                item := Void 
                logger.write_error ("base_selection is void")
            end
        end


end -- class

類別COMPANY_SERVICE

class
    COMPANY_SERVICE

inherit
    DB_SERVICE[COMPANY]
        redefine
            make
        end
...

類公司

class
    COMPANY

inherit
    DB_ENTITY
        rename
            primary_key as id,
            set_primary_key as set_id,
            Primary_key_db_column_name as Id_db_column_name
        redefine
            make,
            make_from_db_result,
            out
        end

create
    make,
    make_from_db_result

....

可聲明的類型聲明detachable G表示,如果相應的實際泛型是引用類型,則該類型的變量可能是可分離的。 在這種情況下,可以將Void分配給此類變量。 但是,實際的泛型也有可能是擴展類型。 給可擴展類型加上detachable前綴是無效的,該類型保持不變,並且不能為該變量分配Void

例如,讓我們考慮一個更簡單的情況,當參數G沒有形式通用約束時。 實際的泛型可能是STRING ,而變量item具有detachable STRING類型。 在這種情況下,可以將Void分配給item

現在,如果實際的泛型是INTEGER ,則該變量具有detachable INTEGER類型,該類型與INTEGER等效。 Void分配給此類型的變量沒有任何意義,並且語言規則不允許這樣做。

如果實際的通用參數是引用類型,則仍可以將變量item設置為Void 為此,可以聲明具有相同類型的局部變量,並將其值分配給item

local
    default_item: like item
do
    item := default_item

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM