1

同じクラスの別のコンストラクターからのメソッドの結果でコンストラクターを呼び出すことは可能ですか?

いくつかの形式で入力を受け入れられるようにしたいのですが、次のようなものがあります。

public class MyClass
{
    public MyClass(int intInput)
    {
    ...
    }

    public MyClass(String stringInput);
    {
        this(convertToInt(stringInput));
    }

    public int convertToInt(String aString)
    {
        return anInt;
    }
}

これをコンパイルしようとすると、

error: cannot reference this before supertype constructor has been called

を参照してconvertToIntください。

4

3 に答える 3

4

convertToInt静的にするだけです。クラスインスタンスの何にも実際には依存していないため、とにかく、実際にはこのクラスに属していない可能性があります。

次に例を示します。

class MyClass {
    public MyClass(String string) {
        this(ComplicatedTypeConverter.fromString(string));
    }

    public MyClass(ComplicatedType myType) {
        this.myType = myType;
    }
}

class ComplicatedTypeConverter {
    public static ComplicatedType fromString(String string) {
        return something;
    }
}

独自のコンストラクターが実行される前に、バックグラウンドでスーパーコンストラクター (この場合はオブジェクト) を呼び出す必要があるため、このようにする必要があります。this目に見えない呼び出しが発生する前に (メソッド呼び出しを介して) を参照することによりsuper();、言語の制約に違反しています。

JLSセクション 8.8.7 およびJLSセクション 12.5 の詳細を参照してください。

于 2012-02-29T19:31:13.830 に答える
2

convertToIntクラスからだけでなく、オブジェクトによって実行する必要があるため、メソッドを呼び出すことはできません。したがって、コードを次のように変更します

public static int convertToInt(String aString)
{
    return anInt;
}

convertToIntコンストラクターが終了する前であることを意味します。

于 2012-02-29T19:31:43.403 に答える
0

いいえ、それは不可能です。インスタンス メソッドを呼び出すには、すべてのスーパー クラス コンストラクターが呼び出されている必要があります。この場合、super() への呼び出しを置き換える this() を呼び出しています。同じ関数に super() と this() の両方を含めることもできません。そのため、スーパークラスのインスタンスが初期化されていないため、このエラーが発生しています。

このように呼び出すことができます

public MyClass(String stringInput) {
    super(); // No need to even call... added just for clarification
    int i = convertToInt(stringInput);
}

メソッドを静的にすると、問題が解決する場合があります。

于 2012-02-29T19:38:04.960 に答える