3

質問の簡単な概要 (TLDR): JavaObjectの型が であることを確認するにはどうすればよいMap<String, Object>ですか?


私はYAMLドキュメントをString. から SnakeYAML を使用して YAML を作成しましたMap<String, Object>が、再度読み取る前に改ざんされる可能性があります。私は PKI 署名に頼りたくありません。値がいたるところにあるMap<String, Object>場合でも、YAML 表現がまだ であるかどうかを確認するだけで十分です。私はコンテンツではなくタイプObjectを気にします。

Objectでは、 anが実際に type であることを確認するにはどうすればよいMap<String, Object>ですか?

タイプ消去のさまざまな SuppressWarnings を回避しようとしている方法は次のとおりです。

Object yamlObject = yaml.load(someYamlDocumentAsString);
// I only want to proceed if this YAML object is a Map<String, Object>
if ((yamlObject instanceof Map<?, ?>)) {
  Map<?, ?> propertyMap = (Map<?, ?>) yamlObject;
  for (Entry<?, ?> propertyEntry : propertyMap.entrySet()) {
    // I am checking each key and throwing if it's not a "String"
    Object propertyKey = propertyEntry.getKey();
    if (!(propertyKey instanceof CharSequence)) {
      throw new BananaException("FIXME"); // FIXME
    }
  }
} else {
  throw new CoconutException("FIXME"); // FIXME
}

上記はもっとうまくできますか?

ちなみに、Java には C# のキーワードに似たものがあるとは思いませんas(MSDN から:as演算子はキャスト操作のようなものです。ただし、変換が不可能な場合、as は例外を発生させる代わりに null を返します。)?


上記のコードの後、これに対する警告を安全に抑制できますか:

@SuppressWarnings("unchecked")
Map<String, Object> aBeautifulAndCozyMap = (Map<String, Object>) propertyMap;
4

1 に答える 1

1

型の消去のため、情報は実行時にわからないため、それを確認する方法は , などしかありinstanceofませgetClass().getName()getDeclaredField("...").getGenericType().getActualTypeArguments()

私の意見instanceofでは、読みやすく、他の開発者があなたのやりたいことを簡単に理解できるので、そのままにしておくべきです。

PS: 私は例外が好きでした ;-)

于 2012-09-11T18:44:59.967 に答える