隼(1.4)から虎(1.5)へ〜JDK1.5について!

このエントリーをはてなブックマークに追加
templete と genericsの区別が分からないアフォはお帰りください。
Bruce Eckel's MindView, Inc: 3-10-04 Generics Aren't
http://mindview.net/WebLog/log-0050
718デフォルトの名無しさん:04/03/13 00:03
Javaのgenericsが糞なのは外出杉。
しかもTigerの新文法はC#の出来損ない。
虎の威を借る狐が増えてるのも春だからかな。
どうせ1.5と過去バージョンの互換性なんてないんだろ。
>>719
オープンソースに頼り切りのJavaプログラマのことですか?
> public class Communicate {
> public <T> void speak(T speaker) {
> speaker.toString(); // Object methods work!
> }
>}
この御仁は interface Speaker があったときに
 Speaker speaker = someSpeakerInstance();
 spearker.toString();
がコンパイルエラーにならない事をご存知ないのかな?
Objectにキャストすればいいじゃん。
genericsの存在理由としては説得力ゼロ。
>>717
そこのサンプルソースって
Java だと普通は interface で解決させるんだけど…
725デフォルトの名無しさん:04/03/13 00:16
つまりgenericsの必要性はゼロ。
Tigerで騒いでる奴はアフォ。C#の方が10000倍まとも。
> つまりgenericsの必要性はゼロ。
普通は必要性はあると思うけど…
使い方が分からん奴には必要性ゼロかもしらん。
お前ら死滅スレから出てくるなよ
728デフォルトの名無しさん:04/03/13 00:23
派遣ドカタ用言語は仕様なんか変えてないで馬鹿でも使えるライブラリ量産してればいいんだよ。ゲラプププ
729デフォルトの名無しさん:04/03/13 00:23
そりゃ、コンパイラ解決による自動cast機能だから、十分に存在意義はある。
ダウンキャストは避けるべし、ってのは昔からの教訓だからな。
今まで放置しておいたJavaが腐っているだけのこと。
春が近いんだねぇ。
>>721
MSに依存しまくりの(ry
春だねぇ。

コンパイル時のことばっかり気にしてないで、
java.lang.reflectパッケージに追加されたクラス群を見てみな。
同じgenericsでも、C++のtemplateに含まれるものとの思想の違いが、
少しは理解できるかもよ。
733デフォルトの名無しさん:04/03/13 01:33
>>732
ん?
その思想の違いを、お前の言葉で判りやすく説明してみろよ。
javaは先進を目指してる言語じゃないだろ、もともと。

言語仕様をコンパクトに抑えることが目的の一つだったはず。
>>733
見た?見てない?
>>732
どういう意味?
VBAのマクロのパスワードを解除するマクロカッターなるものが
あるそうですが、どういう風にしてパスワードを解除してるのか
知ってる人がいたら教えて。

また、本当に解除できるのかも教えて。
タイーホ
739デフォルトの名無しさん:04/03/14 01:38
>>732
俺も聞きたい。
時間があったら説明して欲しいな。

C++のテンプレートがすごいって言ってる人に教えてもらいたいんだけど、
Javaのgenericsにできないけど、C++のTemplateでできますって事は何?
STLはJavaのgenericsでだいたい同じ事ができるよね?
シリアライズがあるJavaの方が便利な気もするけど。

それからC#とJAVAを両方マスターしてる人に教えてもらいたいんだけど
C#とJAVA1.5の違いってデリゲーションだけですか?
740739:04/03/14 01:40
・JavaGenericsとC++Templateの違いはどこか?
・C#とJavaの違いはどこか?

とりあえず、使う使わない、便利不便は別にして
整理してみません?
識者の方よろしくお願いします。
実行速度とかじゃなくて、機能面だけでお願いします。
741739:04/03/14 01:43
とりあえず、参考になりそうなサイトです
http://www.mamezou.com/tec/Tips/javaGenericsVsCppTemplate/
742739:04/03/14 01:45
<機能編>
・JavaGenericsとC++Templateの違いはどこか?
-閉じた多態(bounded polymorphism)と閉じていない多態(unbounded polymorphism)
・C#とJavaの違いはどこか?
743739:04/03/14 01:49
<機能編>

・JavaGenericsとC++Templateの違いはどこか?
-閉じた多態(bounded polymorphism)と閉じていない多態(unbounded polymorphism)
-型パラメーターでnewできない<-これって必要なんですかね・・・

・C#とJavaの違いはどこか?
>>742
741 で挙げたサイトを読めば分かると思うんだけど。。。
745739:04/03/14 01:55
C++とJavaの総称性の機能比較一覧
http://www.mamezou.com/tec/Tips/javaGenericsVsCppTemplate/article2.html#Section2
ってのが用意されてました。

これができる、あれができない
という観点で見ても意味がないという事に気づきました。
JAVAスタイルの設計に不要な機能があっても、意味が無いんですよね。
JAVAスタイルの設計において、過去の互換性を保つために
どこを犠牲にしたかを考える事がいいのかもしれません。
746739:04/03/14 02:00
>>745
それなら、erasure ではない方法で Generics を実現していたなら、
どういうメリット・デメリットがあったかでいいかと。
748739:04/03/14 02:17
749739:04/03/14 02:20
>>747
そういう視点もありますね。

非常に個人的な意見ですが、
互換性よりも機能をとって欲しかったなー、と。
750739:04/03/14 02:28
JavaGenerics概説
http://objectclub.esm.co.jp/JavaGenerics/
によると、
erasureによる欠点は

・Genericクラスの中で,型パラメータ(<T>)をnewできない. -- new T はだめ
・Genericクラスの中で,型パラメータ(<T>)にキャストができない. -- (T)object はだめ
・Genericクラスの中で,型パラメータに対する instanceof ができない.-- object instanceof T はだめ
・Genericクラスを型パラメータ(<T>)から継承できない.
・intなどの基本型を統一的に扱えない.
・例外クラス(Throwableのサブクラス)としてGenericクラスを定義できない

さて、この欠点はどれくらい大きいのでしょうか?

個人的な感想

>Genericクラスの中で,型パラメータ(<T>)をnewできない. -- new T はだめ
これは困りそうだ・・・
>Genericクラスの中で,型パラメータ(<T>)にキャストができない. -- (T)object はだめ
Genericsがあるから、不要なのでは?再帰的に問題になるのか?w
>Genericクラスの中で,型パラメータに対する instanceof ができない.-- object instanceof T はだめ
そんなの当たり前のような・・・無いと困る理由がわからない?
>Genericクラスを型パラメータ(<T>)から継承できない.
難しい・・・やってみないと価値がわからない
>intなどの基本型を統一的に扱えない.
これは重要だ。
でも、確かboxingを導入するんだっけ?
>例外クラス(Throwableのサブクラス)としてGenericクラスを定義できない
わからない・・・
751739:04/03/14 02:31
今気づいた事
VMの互換性というけれど
Javaは任意のプログラムを記述できる
ならば
任意のプログラムの表現はJavaバイトコードに変換できる
したがって、互換性による弊害はないはず?

たぶん、記述したクラスレベルの情報が失われるんでしょう。
よって、プログラムを書く分には問題ないけれど、
デバッガや、IDEを作る人達が困ると、こういう事なんじゃないかな?
C++のtemplateはマクロの延長で、生成的プログラミングのために設計されているのに対し、
Javaのgenericsはコードを生成せずに複数の型が扱えるように設計されている。
この違いは、RTTIへの意識の差が強く関係してるだろうね。
Javaが豊富なRTTIを持っているのに対し、C++は極めて貧弱。

確か数年前にBjarn StroustrupがC++用のちゃんとしたRTTIを設計しようとしてるって話を
聞いたんだけど、どうなったんだろう。
>>751
可能不可能ではなくメリットデメリット。
>>705
templateはC#のパクリじゃないよ。
今のC#ではまだtemplate使えないでしょ。
C#, JavaのtemplareteはどちらC++からのパクリともいえるね
>>713
C++のtemplateはスパゲティ化のリスクを伴う恐れがあるぞ。
それを理解できないクズがC++気取りでC++を褒めているんだろうな
756デフォルトの名無しさん:04/03/14 03:40
>>750
> >Genericクラスの中で,型パラメータ(<T>)をnewできない. -- new T はだめ
> これは困りそうだ・・・
困らない。ちょっと記述が増えるだけ。
しかしこのほうが型安全性は保証される。

> >Genericクラスの中で,型パラメータ(<T>)にキャストができない. -- (T)object はだめ
> Genericsがあるから、不要なのでは?再帰的に問題になるのか?w
> >Genericクラスの中で,型パラメータに対する instanceof ができない.-- object instanceof T はだめ
> そんなの当たり前のような・・・無いと困る理由がわからない?
> >Genericクラスを型パラメータ(<T>)から継承できない.
> 難しい・・・やってみないと価値がわからない
不要だ。なんでもありはリスクを伴う。Javaにtypedefや演算子オーバロードが機能がなくて良かったと
思うのはまさにこのときだよ。

> >intなどの基本型を統一的に扱えない.
> これは重要だ。
> でも、確かboxingを導入するんだっけ?
不要。new Integer(int)で何が不満か? たいしたコード量にもなるまい。

> >例外クラス(Throwableのサブクラス)としてGenericクラスを定義できない
> わからない・・・
不要。リスキーなことは極力避けるべきだ。
>>756

750は個人的な感想と書いてるが。
要は、自分が何をやりたいか(何を求めてるか)が違うだけだろ。
750はC++のように扱いたい
756はあくまでC++のような複雑な言語仕様にしない&誰でも安全なコードが書ける
といったJavaの性質を求めてる、という違い。
>>750
> >Genericクラスの中で,型パラメータ(<T>)をnewできない. -- new T はだめ
> これは困りそうだ・・・
無茶でしょ。

仮に generics の実装が erasure でなかったとしても
Java では特定の引数を持つコンストラクタを持つ事を強制できないので
new T() とかが出来るようにするのはかなりの言語仕様の変更を要する。
>>752
> この違いは、RTTIへの意識の差が強く関係してるだろうね。
他にも型パラメタに指定された型毎に新しいクラス作ってくと
JIT が生成するネイティブコードのサイズが馬鹿にならんとゆー問題もあるらしい。
>>758
C++ みたく閉じていない多態にすれば new T できるよ。
もっとも、>>759 の問題が顕著になるが。

閉じていない多態にすると、例えば interface 使うべきところで
template 使えたりとかオブジェクト指向原理主義から見ると
汚いソースが書きやすくなるのがアレだったのかも。
761デフォルトの名無しさん:04/03/14 20:05
非常にすばらしい文献なので、まとめておきます。

JAVAとC#の比較
http://objectclub.esm.co.jp/cs-vs-java//cs-vs-java.html

J2SE1.5の新機能
http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/contents.html

C++とJavaの総称
http://www.mamezou.com/tec/Tips/javaGenericsVsCppTemplate/

JavaGenerics概説
http://objectclub.esm.co.jp/JavaGenerics/
762デフォルトの名無しさん:04/03/14 20:10
JavaがC#の言語仕様に追いついた感はありますが、
デリゲーションとインデクサの点でちょっと不満がある
ような気もします。
(この点はどうなんでしょうか?)

Javaのメリット
・winでもlinuxでも心配なく相互運用可能。
・オープン(無料って側面がでかいかも)な開発環境や
その他もろもろが使える。

C#のメリット
・言語仕様がちょっとお得。
・CLRが無くても動くwindows用コードが作れる?
>> ・CLRが無くても動くwindows用コードが作れる?
作れない。
>>762
デリゲーションは interface と、その実装クラスで置き換えられるので必要ないといえば必要ない。
インデクサはあれば使うけど無ければ get(index) set(index,obj) すればいーだけだし。
>>764
get(string), set(string,obj) も追加しとけ。