★★Java質問・相談スレッド183★★
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 http://pc11.2ch.net/hp/ Webプログラミング http://pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 (p)ttp://www.wikiroom.com/java/?path,classpath ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 ・String に == は使うな。equals() を使え。※ 質問時の心得 ・コンパイルエラーか実行時エラーか、エラーではないが意図しない動作なのかはっきりしろ。あとエラーメッセージちゃんと読め。 ・前提条件としてOS、開発環境、バージョン、使用フレームワーク等を明記。 前スレ ★★Java質問・相談スレッド182★★ https://mevius.5ch.net/test/read.cgi/tech/1542595026/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured 特に、 When using generics, Java checks for type safety at compile time,but throws away that information at run time, の意味が分かりません。 ちなみに、 type safetyとは何か知りませんし、 at compile timeとat run timeというタイミングの違いによってどういう影響があるのかも分かりません。 学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net 数学 物理学 化学 生物学 天文学 地理地学 IT 電子 工学 言語学 国語 方言 など simulationライブラリで純粋な関数式プログラミングをする UIライブラリ (C#, 2D) を作ったよ 連続と離散を統一した! 4Dエンジン matrixのライブラリ ある強力なFor関数 SQLライブラリ ☆ VM + ASM を書いた (C#, DX) * x86 ではない! ttp://up.x0000.net/files/TSimulang.zip ☆ malloc / free を実装してみた (C#) ttp://up.x0000.net/files/TMallocTest.zip >>420 書籍が古いんでしょ つ var a = new Stack<String>[N]; >>424 ジェネリクスの配列は作れないんよ >>420 > 自然に、なぜ以下のように書かないのかという疑問が思い浮かびます。 > Stack<String>[] a = (Stack<String>[]) new Object[N]; 実行できないからでしょ Objectの配列をStackの配列にキャストできないから 実行時にObjectになるのはジェネリクスの型であってStackではないです > When using generics, Java checks for type safety at compile time,but throws away that information at run time, ジェネリクスを使うとき Javaはコンパイル時に型の安全性をチェックします しかし、実行時にはその情報を破棄します と、いうことなので ジェネリクスの型が正しいかはコンパイル時にチェックされて 実行時にはジェネリクスの型の情報はありませんよという ジェネリクスの型のイレイジャを説明してるんだと思います >>426 型の安全性とは、=の左右の型が一致しているということですか? 実行時には、型が安全であったかどうかという情報を破棄するというのは、どうしてそうするのですか? なぜ、コンパイル時に行う処理と実行時に行う処理に分けるのですか? >>428 > 型の安全性とは、=の左右の型が一致しているということですか? 左右の一致もそうだけどジェネリクスの型が関わるところはすべて Javaは静的型付き言語なので型は実行前に決まるからコンパイルが通ったら 型の不整合は存在しないってこと > 実行時には、型が安全であったかどうかという情報を破棄するというのは、どうしてそうするのですか? イレイジャ方式を採用してるから、なぜイレイジャ方式なのかは過去のものとの互換性のためらしい 詳しくはこのあたりを参照いただければ 贖罪のイレイジャ - プログラマーの脳みそ https://nagise.hatenablog.jp/entry/20160520/1463744926 > なぜ、コンパイル時に行う処理と実行時に行う処理に分けるのですか? イレイジャ方式を採用してるから実行時にキャストが必要になる ((num%31536000)/8)/86400を実行すると213になってしまうんだけど原因わかりますか? 26になるはずなんですが >>432 int num = 50000000 です そもそも期待通りの値がnumにセットされてないと予想 >>431 解決したか? javaの計算についてpublic class UnixTime { private int utime;pri... - Yahoo!知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13229755313 java の計算についてpublic class A { private int u; private static int... - Yahoo!知恵袋 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11229753136 ジェネリクスの型引数はどうして一文字なんでしょうか? 省略せずにわかりやすく書くのが現代のプログラミングの基本だと思うのですが いつまでJavaはわかりにくい書き方に固執するのですか? 型引数はクラスと同格なので、名前が一文字のクラスがあったらぶちギレでしょう なぜ、型引数では一文字が常識とされているのかまったくわかりません たとえばLinkedListクラスはこうなってます LinkedList<E> どう考えてもこうすべきでしょう LinkedList<Element> EだけだとErrorなのかEmptyなのがEggなのかわかりませんよね 僕はわかりましたけどみなさんはわかりませんよね >>444 Javaにはパッケージという仕組みがあるわけですから クラス名がかぶっても問題ないです 確かに一文字ってのは妙な文化だな 強いて理由を探すならこんなところ? ・ユーザー定義の型が入るワイルドカード感をどことなく醸し出したかった ・イレイジャーの存在感の希薄さをほんのり匂わせたかった C#ではTElementだね 普通の型名ではない感を十分に醸し出しつつも説明性を犠牲にしない優れたアイデアだと思う >>445 Elementは既にあるし 被らないならそれに越したことはないよ 順列組合せ関連の質問です。 例えば、{1, 2, 3, 4}の元の数が2の部分集合をすべてほしいとします。 Iteratorがループを回るたびに、そのような元の数が2の部分集合を返すようにしたいのですが、どのように実装すればいいか 分かりません。 単に元の数が2の部分集合をすべてプリントせよという問題ならばできます。 再帰が使えないようなのが難しい原因のように思います。 Ruby なら、この順番 a = [1, 2, 3] a.permutation(2).to_a #=> [ [1,2],[1,3],[2,1],[2,3],[3,1],[3,2] ] stack だろ >>453 では、 1 push 2 push 出力 2 pop 3 push 出力 3 pop 1 pop 2 push 1 push 出力 1 pop 3 push 出力 3 pop 2 pop 最も初歩的なインデックスを使ったイテレーションが素朴に2つのインデックスになるだけでいいのでは イテレーターに変数leftとrightを持たせて、初期値は1と2 rightだけインクリメントしていく rightが末端まで到達したら先頭に戻してleftをインクリメント rightとleftが同値ならとばす とてもシンプル 以下で "x" のところをA, B, C, Eのどれかにすると java.util.ConcurrentModificationException が発生するのに、Dにしたときだけ発生しないのはなぜですか? ¦ ArrayList<String> list = new ArrayList<>(); ¦ list.add("A"); ¦ list.add("B"); ¦ list.add("C"); ¦ list.add("D"); ¦ list.add("E"); ¦ for (String str : list) { ¦ ¦ if ("X".equals(str)) { ¦ ¦ ¦ list.remove(str); ¦ ¦ } ¦ } C++じゃ良く聞く話だけれどもJavaでは上手い説明サイトが無い >>457 コンパイルするとこうなるっしょ Iterator<String> it = list.iterator(); while (it.hasNext()) { String str = it.next(); if ("X".equals(str)) { list.remove(str); } } next()の処理で変更されたかがチェックされている hasNextはこうなっている public boolean hasNext() { return cursor != size; } "D"のときに値を1個削除するとcursor == sizeとなってnextが呼ばれずに処理が終了する なので、"C"のときには値を2個削除すればエラーにならないって感じ AとBがIterableインターフェイスを実装したクラスのインスタンスであり、 A = {1,2,3} B = {4,5,6} みたいになっているとします。 for (int i : A) { for (int j : B) { System.out.println(i + ", " + j); } } を実行すると、 1, 4 1, 5 1, 6 で終わってしまいます。 Bの先頭からまた繰り返したいのですが、どうすればいいでしょうか? 昨日質問した組合せのIteratorは解決しました。ありがとうございました。 あ、リセットするような機能をつければいいみたいですね。 >>460 ありがとうございます すみません、理解できなかったです ご提示いただいたように Iterator を使って以下のように書いてみたら A〜Eどれも例外発生しなかったです ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); Iterator<String> ite = list.iterator(); while (ite.hasNext()) { String str = ite.next(); if ("C".equals(str)) { ite.remove(); } } すみません間違えてました 誤 ite.remove(); 正 list.remove(str); ですね これだと事象再現できて、>>460 さんの説明を理解できた気がします 質問 javaでプログラムを処理中にCtrl+Cでinterruptのシグナルを送って プログラムを強制終了するときにシグナルが送られたことをプログラム側で 検知して処理を分岐させる方法を教えて下さい >>469 Javaでは出来ないからJNIかJNA使ってね >>471 マジですか・・・シグナル送られると例外も投げられないし finallyの処理も行われずにプログラムが終了するんですよね Java難しいです >>469 非標準でいいなら sun.misc.SignalHandler かな。最近のバージョンで使えるかどうかは知らん。 JNAググってみたんですけどこれ凄そうです、これでやってみます ありがとうございます! シグナルの種類どうでも良いなら java.lang.Runtime#addShutdownHook(Thread) でいいんだけど >>476 シンプルそうですね、ありがとうございます! Ruby では、Signal.trap( :INT ) Java には、これぐらい無いのか? このオワコンRuby啓蒙家は何なんだろうな おとなしく廃れてろアホ だってほら、いきなり終わりになったらまずいプログラムもあるだろう。 未経験なら、Ruby 一択! 他の言語は、挫折確率が非常に高い。 だから、全ての学校は、Rubyばかり教える そして、ベンチャー企業は、Ruby on Rails ばかり採用する >>485 自分も40過ぎです、いっしょにJavaやりませう >>485 オレは30代のハゲです。いっしょにJavaやろうじゃないか。 >>490 お前新潟で降機させられて逮捕連行されてたんじゃないの? 数学の「型付きラムダ計算」とは? javaのラムダは型付き? v -> v.toString() こんな風に書いたとき、引数vもtoString()の返値も型を持ってるけど、 そのことなんだろうか? JavaDoc に tl;dr 項目入れてくれ 正確で詳細な仕様が必要な場面より、 パット見で理解できる要約文や具体例が必要な場面のほうが多い それはいいね 最近はIDEでJavadocポップアップするのが当たり前になってるから 要約ブロックがあればJavadocポップアップにも適していると思う Reflection とか Annotation とか使いだして整理しようとすると、 Generics で型情報が消去されるのがほんとうんkですね… 将来的にどうにかできんのですかね… 互換性っていうけど、どの部分の互換性が崩れるんだろ List<String> list; みたいな宣言から、String は取り出せるんだけど List<T> みたいな宣言から、実行時にはじめて決定する型情報を引き出そうとすると無理になる 引数に Class<?> 渡せば良いんだけど、もにょる stream の toArray とかも、配列 new せんとあかんのかいってなるよね… でも原理的に取り出すのが無理ってわけではないよね class ファイルにも型情報ないし、その総称型のコードの実行部分でも、そのオブジェクトの指すポインタからは(List の中身がつまってなければ)型はわからないけど コンストラクタなり、メソッドの呼び出し側は実際の型を知ってるよね多分 callGenericMethod(List<T> arg); ってメソッドがあったとして、呼び出し側クラスのフィールドに、 List<String> list って宣言があればスタックを戻っていけば型情報とれるけど、例えば、 void hoge() { callGenericMethod(new ArrayList<String>()); } みたいなメソッド内の呼び出しでも、Stack 探せば型情報ってあるよね Reflection でローカル変数の情報引き出せないとすると、デバッガ関連のAPI で、コード領域のメモリ検索してみたいなことしないといかんのか JVM 側にそういう機能があれば可能になるんじゃなかろうか デバッガ全部実装ってなると処理重いだろうけど、こういう局所的な機能だとどうなんだろ 無理なんかな genericsがなかったとき、Listの要素はすべてObjectだった。その頃との互換性。 今でもListをコンパイルするとObjectのリストになる。 実行時の型情報はgetClassで取得できると思うけど 型消去の利点はコンパイル結果のclassファイルの互換性を保ち仕様変更を抑えられるところ Java5で書いたコードを1.4以前の環境でも動かせたりする classを相手にしないといけないツールやミドルウェアへのインパクトが小さい 型消去で妥協したからこそJava5でgenericsを導入できたしダメならJavaはより早く衰退していた可能性もある それはよくある迷信というか当時のSunの詭弁 そもそもジェネリクスを使うにはJava1.5以降のランタイムが必要なんで、Javaを利用する立場ではバイトコードの互換性には実質的に何の意味もないのよ ジェネリクスが残念仕様になったのはひとえに当時のSunに金がくてJVMに手を出せなかったからで、事実Oracleになって金に余裕ができてからはJVMは拡張されまくってる 1.4以前のgenerics使ってない過去のコード資産を 1.5以降のgenerics環境でも使えるようにするのか、それとも綺麗サッパリ捨てるのかって話であって 1.4以前でもgenerics使ってるコードを動かせるようにするって話じゃないんよ…… そっちの互換性は.NETでは普通に実現できてたから、それが理由ならSunに技術力がないということになるよ ドトネトは後発だからなーJavaよりも先に作られてて Generics導入前との互換性が完全に保証されてるなら MSはSunよりも技術力があると認めてやってもいいけどちがうじゃんか ドトネトは互換性を切り捨てて言語の進化を優先した 言語が作られたばかりで利用者が少なく既存プログラムが少なかったからできたことだよ .NET Framework 4.5と下位バージョンの互換性がカオス https://freesoft.tvbok.com/tips/os/net_framework_45.html c#が登場したのは2000年。リリース時点でgenericsを考慮してなかったら、むしろmicrosoftの技術力を疑うわ。 実際、microsoftがgenericsの前身の研究を始めたのは1999年だし そいやJVMの拡張って具体的には何の事言ってんの? バイトコードレベルっつーか命令セットレベルではinvokedynamicぐらいしか変更なかったと思うけど…… スーパー過疎スレだし、日記はブログに書けって言われるか、もしくは反応0かと思ったけど、 歴史的なうんぬんとかいろいろ書いてくれる人いてありがたい ちゃんとウォッチしてる人もいるんだねここ 型消去って、JVM や class ファイルの仕様だから、 Kotlin とか Groovy とかの後発JVM言語とかでも型消去はされるんよね? その辺のスクリプトってランタイムにいろいろいじくれる印象だけども 基本的にリフレクションのAPIをごちゃごちゃいじって出来ないことは、Kotlin Groovy でもできないってことなんかな >514 kotlinやgroovyも実行時にgenericsの型消去されるのはその通り。 >>515 は嘘松 リフレクションで何をしようとしたの? >>517 回答ありがとう lombok の @Builder @Singular がカスタマイズ性低くて不満だったから、 Builder パターンのソースコードを自分で自動生成できないかなと思ったんだよね ASD とか使ってやるのが正統派なんだろうけど、使い方覚えるのとか時間かかりそうだし、 そのままデフォで用意されてるリフレクション使ってパッと作れないかなと とある対象クラスの1つがジェネリクス使ってて、困ったなどうしようかなって感じです Producer extends Consumer super ってのは頭にあるけど、 これいつもこんがらがる EnumSet の 3値版みたいなのってデフォでは用意されてないですよね?多分 true false ともう一個くらい欲しい あるインスタンスに関して、include するか exlude するか ignore するかみたいなフラグ そして、その3値のフラグがいっぱい欲しいとき EnumSet は、1bit で 1 flag だけど、2bit で 1flag みたいなの(これだと4値まで扱えるけど) ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる