1

簡単な質問: 次のジェネリック クラスでは、ジェネリック型と含まれる型をどのように定義して、null 許容にする必要がありますか? 以下はコンパイルされません。

class Pair? of G1, G2: Object

    _first:G1?
    _second:G2?

    construct()

        _first = null
        _second = null

    def insert( first:G1, second:G2 )

        _first = first
        _second = second

    def insert_first( value:G1 )

        _first = value

    def insert_second( value:G2 )

        _second = value

    def second():G2

        return _second

使用法:

var pair = new Pair() of string, string
pair = null
4

2 に答える 2

2

型として null を持つ型パラメーターの概念に頭を悩ませることはできません。私はそれが有用な概念だとは思わない。したがって、クラスの定義は次のようになります。

[indent = 4]
class Pair of G1, G2: Object

    _first:G1?
    _second:G2?

    def insert( first:G1, second:G2 )
        _first = first
        _second = second

    def insert_first( value:G1 )
        _first = value

    def insert_second( value:G2 )
        _second = value

    def second():G2
        return _second

オブジェクト インスタンスを持つ変数を null に再割り当てする必要がある場合は、次のようになります。

[indent = 4]
init
    var pair = new Pair of string,string()
    pair = null

ただし、Vala コンパイラは、pairスコープ外になると逆参照します。したがって、null を割り当てる必要がある理由がわかりません。

null の使用は、理想的には、私の考えでは C ライブラリとやり取りする場合にのみ使用されます。null にアクセスすると、適切にチェックされていない場合、クラッシュ (セグメンテーション違反) が発生する可能性があります。例えば:

init
    a:int? = 1
    a = null
    var b = a + 1

Vala コンパイラには、安全でないコードをチェックする実験的な非 null モードがあります。Vala スイッチを使用して以下をコンパイルすると、次のようになります--enable-experimental-non-null

[indent = 4]
init
    var pair = new Pair of string,string()
    pair = null

次のエラーが表示されます。

error: Assignment: Cannot convert fromnull' にPair<string,string>'

結果を理解している場合は、コンパイラにこれで問題ないことを伝えることができます。

[indent = 4]
init
    pair:Pair? = new Pair of string,string()
    pair = null
于 2018-02-28T10:25:17.767 に答える