variance と wildcard

おだすきせんせー面白い
3
なぎせ ゆうき @nagise

C#はワイルドカードが使えないことに息苦しさを感じるなあ…。あれはランタイムが型を持つがゆえのデメリットなのか、単にランタイムの型の扱い方がイマイチなのか。多分、イレイジャじゃないからといって無理というわけではないと思うんだが確証がない

2014-05-27 14:36:08
B_head @B_head00

ジェネリクスのワイルドカードは型安全では無いから・・・

2014-05-27 14:37:35
なぎせ ゆうき @nagise

@B_head00 具体的には?実行時型安全のことですかね?

2014-05-27 14:38:27
なぎせ ゆうき @nagise

実行時に型を持ってるなら実行時型安全なワイルドカードが作れそうなもんだけども

2014-05-27 14:39:48
B_head @B_head00

@nagise そうですね、プリミティブの配列と同じ問題があるわけですね。

2014-05-27 14:44:10
Atsushi Igarashi @50storms

@nagise 特にランタイムの型引数情報の有無とワイルドカードは関係ないはずです。C# は(安全な)型引数バリアンスがあるので(「ので」ってこともないでしょうけど)ワイルドカードはないのかもしれません。

2014-05-27 14:46:46
B_head @B_head00

ん、でもJavaのは実際に使ったことがないから何か勘違いをしている可能性はあるな・・・

2014-05-27 14:47:18
なぎせ ゆうき @nagise

@50storms 後方互換性の問題、ということであれば一番納得感あるんですけどね

2014-05-27 14:51:14
B_head @B_head00

ちゃんと調べて見ると、思っていたよりも複雑な仕様っぽい・・・? これJavaの仕様書見に行かないとダメな感じかな・・・

2014-05-27 14:51:29
Atsushi Igarashi @50storms

@nagise バリアンス+ワイルドカードは悪夢だからじゃないでしょうか :-) 不可能な組み合わせではないのですがおそらく複雑すぎます。「組み合わせるとこんな素晴しいことが!」って論文はあるのですが :-)

2014-05-27 14:56:37
B_head @B_head00

そもそもJavaのワイルドカードは変数宣言の時に指定するものなのか。 まずそこから勘違いしてたw C#の共変性と反変性はクラスや関数定義の時に指定するタイプだから・・・

2014-05-27 15:08:42
なぎせ ゆうき @nagise

型の安全性の厳密解が妙に難しくなることは分かるんだけど、実用上はそんなに厳密じゃなくてもいいんだよってのはあると思うんだよね。そんなファジーなのは逆に線引きが難しい気もするが

2014-05-27 15:11:52
なぎせ ゆうき @nagise

プリミティブ型をラッパーでジェネリクスするのはOptional使えばいくらかマシに…なるのか?

2014-05-27 15:14:04
B_head @B_head00

JavaのワイルドカードとC#の共変性と反変性、どちらも一長一短という感じ。

2014-05-27 15:21:00
B_head @B_head00

ワイルドカードのメリットは使う側が後付で共変・反変を指定できること。 デメリットは使う側が仕様を理解して適切に共変・反変の指定をしなければいけないこと。

2014-05-27 15:23:48
B_head @B_head00

@nagise すいません、今調べたらそれなりの型安全性は確保されていました・・・ 勘違い怖い。

2014-05-27 15:26:03
Kentaro Inomata @matarillo

@nagise ワイルドカードというか、使用側での変性定義については、C# でのジェネリクスサポートを最初に研究していたMS Researchでも検討していたようです(そういう資料が公開されてます)。

2014-05-27 15:27:25
なぎせ ゆうき @nagise

@B_head00 一応、実行時にリフレクションとかで変な値をツッコむとか、型変数をバインドしないraw型をつかって有耶無耶にするとかしたら悪さはできるんですが。いまどきのIDEだとそういう危なげなところは警告出ますし、敢えてやってるならアノテーションで警告消しという運用ですね

2014-05-27 15:27:44
なぎせ ゆうき @nagise

@matarillo なるほど。たしか変性については以前に複雑すぎるから論を言ってましたよね

2014-05-27 15:29:06
Kentaro Inomata @matarillo

@nagise たしか @kmizu さんのはてなダイアリーでそのような記事を見たような。

2014-05-27 15:29:16
B_head @B_head00

C#の共変性・反変性のメリットは使う側が仕様をあまり理解していなくても流れで使っていけること。(少なくともEnumrator<out T>はそう思う) デメリットはライブラリ側が設計の努力をしなければいけないことと、共変・反変を扱うインターフェイスが必要になるかもしれないこと。

2014-05-27 15:30:52
B_head @B_head00

・・・使用側での変性定義と提供側での変性定義を同時に提供する事はできるのだろうか。

2014-05-27 15:33:14
なぎせ ゆうき @nagise

@B_head00 ざっくりJavaの話をすると、変数の型にパラメタライズドタイプ(ようは型変数をとる変数型)を使った場合の変性の指定と、APIのクラスで型変数を定義する際に境界、つまり型変数にバインドできる型がどういう継承型であるかの指定の2つがあります

2014-05-27 15:35:56