-1

ジェネリックの前に特定のタイプのオブジェクトのみを受け入れるように配列リストを制限するにはどうすればよいですか

4

2 に答える 2

2

許可された型のみを受け入れるラッパー関数を作成し、コレクションを非表示にします。これは、Java-5 より前の標準的なベスト プラクティスでした。

private final List strings = new ArrayList();

public void add(String s)
{
    strings.add(s);
}

public String remove(String s)
{
    return (String) strings.remove(s);
}

// etc...

はい、これは最悪です。

質問してもいいですか: ジェネリックを使用しない理由はありますか? Java 1.4バイトコード互換です。

于 2012-05-13T06:22:17.933 に答える
1

2つのオプション(ここではC#を想定していますが、すべてがほぼすべてのオブジェクト指向言語に適用されます)。

1)選択したコレクションタイプ(またはそのインターフェイス)から継承し、すべてのメソッドをオーバーライドして、次のような間違ったタイプで例外をスローします。


public class MyType
{
    // Your type here
}

public class MyTypeCollection : ArrayList
{
    public override int Add(object value)
    {
        if (!(value is MyType))
        {
            throw new ArgumentException("value must be of type MyType");
        }

        return base.Add(value);
    }

    public int Add(MyType myType)
    {
        return base.Add(myType);
    }

    // Other overrides here
}

または2)(おそらくより良い)、独自のタイプを完全に作成し、コレクションに必要なインターフェイスを実装し、非ジェネリック、非タイプのコレクションを内部で使用します。このようなもの:



public class MyTypeCollection2 : IEnumerable
{
    private readonly ArrayList _myList = new ArrayList();

    public void Add(MyType myType)
    {
        _myList.Add(myType);
    }

    // Other collection methods

    public IEnumerator GetEnumerator()
    {
        yield return _myList.Cast<MyType>();
    }
}

気になるすべてのインターフェースを実装してください。.NET Frameworkでは、ArrayListに実装されているインターフェイスは次のとおりです。IList、ICloneable

お役に立てれば。

于 2012-05-13T06:33:16.953 に答える