★★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 ((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値まで扱えるけど) ありがとう
たしかに、boolean の代わりにつかのならいいかもしれませんね OptionalBoolean
だけど、bit flag 的な動作(=EnumSet のような仕様)のクラスは多分自作しないとない感じですよね だってあなた true と false ともう1つって言ったじゃない boolean の 3値版 は OptionalBoolean、3値以上ほしければ、enum だけど
EnumSet の 3値版 boolean の 3値版 は OptionalBoolean、3値以上ほしければ、enum だけど
EnumSet の 3値版 よくよく考えたら HashMap のラッパみたいなので事足りそうかも
すまそ でもよくよく考えたら、機能的にはそれでいいけど、内部的に bit flag 的な動作になってないから
もともとの目的達成してないわ…すまそ ■ このスレッドは過去ログ倉庫に格納されています