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

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

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

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

Q&A

解決済

1回答

3737閲覧

Javaの”異なるメソッドで定義されたインナー・クラス内で非final変数を参照できない”エラーについて

t-miyazaki

総合スコア71

Java

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

0グッド

0クリップ

投稿2015/07/14 07:38

お世話になります。

次のようなプログラムをEclipseで編集していたのですが、
JavaSE-1.8の環境では何もエラーが出なかったので気付かなかったのですが、
JavaSE-1.7以下の環境に持っていくと
「異なるメソッドで定義されたインナー・クラス内で非final変数listを参照できません」
というエラーが表示されました。
原因はList<Integer>の宣言位置を間違えていたということで解決したのですが、

Java-SE1.8でエラーが出ないのが気になります。
Javaのバージョンが1.8になって仕様が変わったのでしょうか?

プログラムは以下のとおりです(再現プログラムなので簡略化しています)。

lang

1import java.util.ArrayList; 2import java.util.List; 3 4public class Test { 5 6 Test() { 7 List<Integer> list = new ArrayList<Integer>(); 8 9 new Interface() { 10 @Override 11 public void function(int x) { 12 list.add(x); 13 } 14 }; 15 16 } 17 18 public static void main(String[] args) { 19 Test t = new Test(); 20 } 21} 22 23interface Interface { 24 void function(int x); 25}

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

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

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

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

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

guest

回答1

0

ベストアンサー

仕様が変わったためにエラーが出なくなっています。

Java8(Java SE 8)では、「実質的final」(effectively final)という言語仕様の変更がありました。
これはfinalを付けてもコンパイルできる状態であれば、finalを付けなくてもfinal扱いする、という機能です。

listは非final変数ですが、「実質的final」のため、Java8ではコンパイルエラーにならなくなりました。

投稿2015/07/14 08:03

argius

総合スコア9390

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

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

t-miyazaki

2015/07/14 10:25

回答ありがとうございました。 やはり仕様変更があったのですね。 listを勝手にfinalにしてくれていたんですね。 エラーメッセージで検索しても出てこなかったので、 わかりませんでした。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問