5

このトピックに関する情報を見つけるためにGoogleでかなりの時間を費やしましたが、Java列挙型と共変リターン型の両方に関連する結果はほとんど存在しませんでした。

つまり、次のように、列挙型クラスでメソッドを定義し、インスタンスでそれをオーバーライドする列挙型メソッドで共変リターン型を使用することは可能ですか?

package enumcovariance.test;

public enum CovariantEnum {

    INT_INSTANCE(new Integer(3)) {
        @Override
        public Integer getData () {
            return (Integer) super.getData();
        }
    },

    STR_INSTANCE("Hello world") {
        @Override
        public String getData () {
            return (String) super.getData();
        }
    };

    private final Object data;

    private CovariantEnum(Object data) {
        this.data = data;
    }

    public Object getData () {
        return data;
    }

}

そして、次のように共分散を利用します。

package enumcovariance.test;

import org.junit.Test;


public class CovariantEnumTest {

    @Test
    public void intEnumTest () {
        Integer i = CovariantEnum.INT_INSTANCE.getData();
    }

    @Test
    public void strEnumTest() {
        String s = CovariantEnum.STR_INSTANCE.getData();
    }

}

この場合、コンパイラは私の列挙型定義で問題ありませんが、テストケースはコンパイルに失敗し、オブジェクトを整数(または文字列)に変換できないと言っています。どうやら、コンパイラはメソッドの基本定義のみを調べ、オーバーライドするメソッドは調べないようです。別の列挙型定義を使用して、基本メソッドを抽象化しましたが、それでも機能しませんでした。

コンパイルプロセス中に列挙型が変換されて機能しなくなるのは複雑なことだと思いますが、私だけが愚かなことをしているのではないことを確認したいと思います。

このテストケースは確かに非常に工夫されていることに注意してください。私の実際の列挙型では、この機能の方が便利です。必要に応じて投稿できます。

4

1 に答える 1

2

のタイプCovariantEnum.INT_INSTANCEはからCovariantEnum戻ります。ObjectgetData

enum残念ながら、型をジェネリックにすることもできません。

于 2011-01-07T14:27:11.447 に答える