もちろん、マップに要素を追加するためにラッパーメソッドを使用し、そこにIntegerとSringのチェックを行うことができます。しかし、あなたはランタイムエラーが発生します。静的なエラーを取得するために型を制限するほうがはるかに優れていることに私は同意します。そのために
、私は実際にInteger.classとString.classを使用していないだろうが、列挙型:
enum Types { String, Integer };
private Map<String, Types> attributeList = new HashMap<String, Types>();
UPDATE:
は、考えてみれば、他は(そこにありますあなたがの場合、クラスオブジェクトに固執するがあります:偽の列挙型パターンを使用できます。つまり、列挙型のような定数セット(通常は2^iの整数が使用されます)を使用できます。したがって、クラスオブジェクトを定数として定義することができます。もちろん、他のクラスオブジェクトがマップに入れられないことを保証するものではありません。そのため、Joshua Blochの項目30では、「int定数の代わりにenumを使用する」と記載されています。しかしあなたが偽の列挙型チェッカーを使用して、定数の上に追加の型システムを引っ張ってChecker Frameworkを使用することができます。
@SuppressWarnings("fenum:assignment.type.incompatible")
public class TypeEnum {
public static final @Fenum("Types") Class INT_CONST = Integer.class;
public static final @Fenum("Types") Class STR_CONST = String.class;
}
次にあなたがClass型の制限を使用してマップを定義することができます
private HashMap<String, @Fenum("Types") Class> attributeList
= new HashMap<String, @Fenum("Types") Class>();
もちろん、Fenum Checkerをコンパイラに含める必要があります。
ほとんど同じ回答を投稿しようとしていました。アプローチは明確で柔軟性があります。しかし、あなたはnull値で何をするつもりですか? –
ヌル値はどうですか? – DaveFar
私は実際にそのようなものを正確に探していました! Thx - それについて考えるよ!ここではその1つのやっていないのはなぜ –