質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2508閲覧

LinkedListのofferメソッドを呼び出す際に発生するエラーについて

ramune3

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/05/31 02:33

編集2017/05/31 03:03

###質問内容
Javaを学んで2ヶ月です。
LinkedListでFIFOのリストを作成しているのですが、offerメソッドを呼び出そうとすると**「エラー:シンボルを見つけられません」**と出てきます。

・書き換えてaddメソッドを呼び出すと、問題なくコンパイルできるので、使用する変数の間違いや入力ミス、オブジェクトの生成ミス、クラスの読み込みミスではなさそう。
・APIを見る限り、同じboolean型の戻り値で、public、引数も「E e」で保持される要素の型なので、addとoffer間で、大きく記述方法が違うということもなさそう。

大変初歩的なエラーメッセージだという認識はあるのですが、上記のような状態のため、原因の見当がつきません。

エラーが発生している原因、addメソッドは呼び出せるのにofferメソッドではエラーになる原因について、ご教示いただきたいです。

###コード内容

java

1import java.util.LinkedList; 2import java.util.List; 3public class Hoge{ 4 public static void main(String[] args){ 5 int i = 1; 6 HogeHoge hogehoge = new HogeHoge(null,0); 7 List<HogeHoge> hoge = new LinkedList<HogeHoge>(); 8 List<Integer> hogeNumber = new LinkedList<Integer>(); 9 //中略 10 if(hoge.offer(hogehoge)){ 11 //hoge.add(hogehoge)ならコンパイル、実行成功 12 hogeNumber.offer(i); 13 //hogeNumber.add(i);ならコンパイル、実行成功 14 System.out.println("hogehoge:「" + i + "」"); 15 i++; 16 } else { 17 System.out.println("これ以上追加できません"); 18 } 19} 20 21public class HogeHoge{ 22 //省略 23 HogeHoge(){ 24 this(null,0); 25 } 26 HogeHoge(String x,int y){ 27 } 28 //後略 29}

###エラーメッセージ
Hoge.java:xx:エラー:シンボルを見つけられません if(hoge.offer(hoge)){ シンボル: メソッド offer(HogeHoge) 場所: タイプList<HogeHoge>の変数 hogehoge Hoge.java:xx:エラー:シンボルを見つけられません hogeNumber.offer(i); シンボル: メソッド offer(int) 場所: タイプList<Integer>の変数 hogeNumber エラー2個

###その他
サクラエディタを使用して、コマンドプロンプトで動かしています。
jdk1.8.0_121をインストールしてあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2017/05/31 02:55

クラス HogeHoge は、どこで定義されているのですか?
ramune3

2017/05/31 03:00

省略してしまいましたが、同じパッケージ内で定義しています。追記します。
guest

回答2

0

Java

1List<HogeHoge> hoge = new LinkedList<HogeHoge>();

問題はここです。
offerメソッドは確かにLinkedList(Dequeインターフェース)にありますが、
List型の変数に格納していまっているため呼び出せないのです。
addメソッドでコンパイルが通るのはListにはaddメソッドがあるからです。

以下のように修正しましょう。

Java

1LinkedList<HogeHoge> hoge = new LinkedList<>(); 2または 3Deque<HogeHoge> hoge = new LinkedList<>();

ただですね。LinkedListのaddとofferは全く同じ処理をしていますので、
addで問題ないんです。
つまり今のままのソースで、offerをaddに書き換えるだけでOKということです。

Java

1List<HogeHoge> hoge = new LinkedList<HogeHoge>(); 2// List型ではofferは呼べないが、LinkedListのaddとofferは同じためaddでいい。 3hoge.add(hogehoge);

投稿2017/05/31 02:59

編集2017/05/31 03:39
root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/05/31 03:06

FIFO作ろうとしているのにaddでいいというのはちょっと…
root_jp

2017/05/31 03:24

offer使いたいと言っているので、てっきりaddでいいのかと思ってしまいましたが、 確かに、FIFOでaddはおかしいですね。。。 addFirst と removeLastですね。
swordone

2017/05/31 03:30

逆では? addLastとremoveFirst
root_jp

2017/05/31 03:41

僕のキューのイメージでは、先頭に突っ込んで末尾から取り出していくイメージなんですが、 逆なんですかね?w addLastでいいのであれば、addでもいいですね。addとremoveFirst。
ramune3

2017/05/31 04:31

丁寧な回答ありがとうございます。 FIFO、LIFOなど、作りたいリストの構造に合わせたメソッドを使用するとよいのですね。 勉強になりました。
guest

0

ベストアンサー

メソッドがあるかないかの判定は、変数の持つインスタンスの実体型ではなく、変数の宣言型で行われます。
いまhogeなどはList型として宣言されており、Listインタフェースはofferというメソッドを持っていません。hogeなどの型をLinkedListや、Dequeで宣言してください。

投稿2017/05/31 02:56

編集2017/05/31 03:00
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ramune3

2017/05/31 04:29

宣言型として定義したインタフェース側に存在していないメソッドを使用していたのですね。なるほど。 おっしゃる通り、 LinkedList<HogeHoge> hoge = new LinkedList<HogeHoge>(); LinkedList<Integer> hogeNumber = new LinkedList<Integer>(); に宣言を修正したところ、コンパイルエラーにならずに実行できるようになりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問