Pleiades Eclipseでprotectedなフィールドへのアクセス時のコンパイルエラーについて

このQ&Aのポイント
  • Pleiades Eclipseでprotectedなフィールドへのアクセス時にコンパイルエラーが発生しません。
  • Eclipseのバグか設定で変更可能か調査結果を教示してください。
  • Eclipse3.5(JREなし版)を利用して開発中ですが、protectedフィールドへのアクセス時に赤線が出ず困っています。
回答を見る
  • ベストアンサー

Pleiades Eclipse で protected なフィールドへのアクセス時

現在、Pleiades サイトで配布されている、Eclipse3.5(JRE なし版) を利用して開発しています。(http://mergedoc.sourceforge.jp/) その Eclipse において、コンパイルエラーになってほしいのに、赤線が出ず困っています。 たとえば A クラスと B クラスがあった場合に、 class A {  protected int f1; } class B {  public void meth(A a) {   a.f1 = 10;  } } と記述した場合に、f1 へのアクセス(B クラス meth 内)がエラーとなりません。実行時にエラーとなってしまいます。 f1 を private にすると、コンパイルエラーになります。 B クラスは A クラスを継承していません。 これは Eclipse のバグでしょうか、設定で変更できる場合はその設定方法をご教示いただけないでしょうか。 以上、よろしくお願いいたします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • me_star
  • ベストアンサー率100% (1/1)
回答No.1

> protectedフィールドは「パッケージの異なるクラスからアクセスする > ことができない」という制限が設けられている。ただし、パッケージが > 異なっていても「サブクラスからのアクセス」は許可されている。 参考サイトより 明示的にパッケージを指定していないのであれば, 同一のデフォルト・パッケージとなるので, protectedフィールドにアクセスできて問題はありません.

参考URL:
http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000138.html
hatimiti
質問者

お礼

ご回答ありがとうございます。 同一パッケージからアクセスできるのは、 デフォルトアクセス修飾子だけと思いこんでおりました。 たしかにそれならばコンパイルエラーにならないのは理解できました。 しかし、実際に f1 に、a.f1 = 10; とアクセスしている箇所で、 java.lang.IllegalAccessError: tried to access field となってしまい、実行時エラーとなります。 フレームワークに SAStruts + S2Container を使用しているのですが、 DIの関係で実行時エラーになってしまっているのですかね、、、

関連するQ&A

  • eclipse4.2でデコンパイルできない

    いつもお世話になります。 最近リリースされたeclipse4.2を使用しています。 実際に使用しているのはPleiades Full All in One (JRE あり)です。 eclipseでclassファイルを開くと、以下のエラーが発生してデコンパイルされません。 org.eclipse.core.runtime.CoreException: テキスト・エディターには文書プロバイダーがありません ただ全てのファイルがデコンパイルされないわけではなく、デコンパイルされるファイルもあります。 Jadclipseの設定はデフォルトのままで何も変更していません。なぜこのようなエラーが発生しまうのでしょうか。 宜しくお願いします。 OS : Windows Vista Home Premium 64bit SP2 eclipse : eclipse4.2 Pleiades Full All in One (JRE あり)

  • pleiades、eclipseに詳しい方質問えす

    ヘローワールドを出力するプログラムをビルドしようとすると(eclipse with CDTとかいうのをインストールしました) Invoking autoreconf in build directory: L:/Documents/pleiades-e3.7-cpp-jre_20110924[1]/workspace/test Configuration failed with error (プログラム "sh" を実行できません: 起動失敗) っていうエラーが出てどうすればいいのかわかりません コンパイラは mingwを使ってます mingw/binへのパスは追加されてます えくりぷすはインディゴです(3.7) よろしくおね霊がmすいます

    • ベストアンサー
    • Java
  • C++ protectedにアクセス不可

    C++でお聞きしたいことがあります。 初心者ですのでご容赦ください。 //基本クラス class a1 { protected: a1(); }; //派生クラス class a2 :public a1 { protected: a2():a1(){}; //継承先以外から作成されたくない int t; }; class a3 : public a2 //a2を継承 { public: a3(); ~a3(); private: a2* a; //a2のポインタを持つ }; a3::a3() { t = 3; a = new a2; //コンストラクタの中でnew } a3::~a3() { delete a; //終わったらdelete } int main(void) { a3 a; return 0; } というソースでa3はa2を継承しています。 ですのでa2のprotectedメンバtにアクセスできるはず。 ここまではいいのですが、 a2のコンストラクタもa3でアクセスでき無いのでしょうか? a3のコンストラクタでnewしようとすると error C2248: 'a2::a2' : protected メンバ (クラス 'a2' で宣言されている)にアクセスできません。 a2::a2' の宣言を確認してください。 というエラーが発生します。 やりたいのはa2のような基本クラスが6つほどあり、 a2のメンバ変数が多いので コンストラクタの引数で指定されたものだけ コンストラクタないでnewしたいのです。 なぜ、できないのか? どうすればnewできるようになるのか…。 非常にお手数ですが、 どなたかご回答いただけませんでしょうか? 長文になりましたが、宜しくお願いいたします。

  • eclipseの設定のJREとコンパイラの違い

    eclipseの設定で、インストール済みのJREとコンパイラの違いについて教えて いただけないでしょうか。 自分で調べてみた限りでは、、、 インストール済みのJREは、Javaプログラムの実行、デバッグに使用される。 コンパイラは、Javaプログラムのコンパイルに使用される。コンパイラ自体はeclipse 内部のものを使用しており、コンパイラ準拠レベルを指定することにより、指定した Javaのバージョンでコンパイルを行うことが可能。 上記の仕様だと、例えばインストール済みのJREのバージョンを1.6、コンパイラ準拠レベル に1.4を指定したとします。こうした場合、 String s = "hoge"; if(s.isEmpty()) { ・・・・ というコードはコンパイルエラーになるはずです。(String#isEmpty()は1.6から導入) コンパイルエラー⇒クラスができない⇒実行できない、という流れを想定していたの ですが、実際は、エディタ上でエラーになっておらず、コンパイルもでき、実行もできました。 インストール済みのJRE、コンパイラともに1.4を指定すると、エディタ上でエラーに なっていたし、コンパイルも行われていませんでした。 コンパイラ準拠レベルとはいったい???という状態です。 どこかに詳しく説明されているサイトなども教えて頂けるとうれしいです。 宜しくお願いします。 OS:Windows7 HomePremium eclipse:eclipse-jee-indigo-SR1-win32-x86_64.zip

    • ベストアンサー
    • Java
  • eclipse 3.5 pleiades all in one にてJ

    eclipse 3.5 pleiades all in one にてJavaのコーディングを行っています。 debugモードにて起動した後ブラウザにてリクエストすると、ブレークポイントの設定箇所にて処理が止まるのですが、画面には「ソースが見つかりませんでした。」と表示されてしまいます。どのようにすれば改善できるでしょうか。 なお、すでに検索エンジンにてエラーメッセージをキーに対処方法を検索し、試せるものは全て試しました。試した内容は以下のとおりです。 試行1.ウィンドウ→設定→Tomcat→ソースパスで該当プロジェクトにチェックが入っていることを確認 試行2.全てのブレークポイントを除去後、eclipse起動時にcleanオプションを付加して起動 ※JavaのビルドパスのJREシステム・ライブラリにはjdk1.6を指定しています ※GAE/Jの開発です

  • Eclipse について

    日本語 Eclipse 3.6 Pleiades All in One Javaを使わせて頂いたのですが、JRE1.6にセキュリティホールがあるとPSIに出ます。アップデートしようとしてもJavaセットアップ 進捗中にコアファイルの解凍に失敗しましたとでてうまくいきません。 アップデートの問題解決方法を教えてください。 恐縮ですが、アップデートが出来ない場合、最新のJREのものがありましたら教えてください。お手数ですがよろしくお願い致します。

    • ベストアンサー
    • Java
  • Eclipse:Javaの拡張ライブラリ使い方

    Javaの参考書を見ながら勉強を始めた者です。 そろそろテキストエディタとコンソールでコンパイル・実行 という開発環境から卒業しようと思い、Eclipseを使うことにしました。 Eclipse3.7のインストール、Pleiades 1.3.3による日本語化も終わり、"Hello world"も出力でき、 新しい開発環境も用意できたと思ったころで壁にぶち当たりました。 Eclipseで拡張ライブラリを追加して使用する場合は何か設定をしなければならないのでしょうか? 実はdodai.jarという拡張ライブラリ(参考書の付属)を使って課題を進めているのですが、 これが「テキストエディタとコンソールでコンパイル」環境では上手く使えているのですが、 Eclipseでプロジェクトを作成し、ビルドしたところ下記のようなエラーが起こってしまいます。 ------------------------------------------------------------------------------------------------------ Exception in thread "main" java.lang.Error: Unresolved compilation problems: Dodai を型に解決できません Dodai を型に解決できません ------------------------------------------------------------------------------------------------------ "Dodai"というのは拡張ライブラリのクラス名です。 また、前環境で、拡張ライブラリを使用するにあたり、行ったことは以下です。 ・拡張用ライブラリdodai.jar を /Library/Java/Extensions/配下 に置く。 Eclipseの画面上で自分なりに確認できたことは以下です。 ・Eclipseのパッケージエクスプローラでは、JREシステム・ライブラリーの配下にdodai.jarという項目が表示されています。 ・JLabelのようなJREライブラリのクラスは使えています。 開発環境 ・MacOS10.6.8 ・java version 1.6.0_26(元々JDK(Java SE Development Kit)が入っていた。) ・拡張用ライブラリdodai.jarの場所は/Library/Java/Extensions/配下 ・統合開発環境 Eclipse3.7 ・日本語化 Pleiades1.3.3 Eclipseで拡張ライブラリを追加して使用する場合は何か設定をしなければならないのでしょうか? どなたか、拡張ライブラリのクラスの使い方を教えて下さい。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Eclipse初心者です。パースペクティブのところがよくわかりません。

    Eclipse初心者です。パースペクティブのところがよくわかりません。どうか力をお貸しください。 http://mergedoc.sourceforge.jp/index.html#/pleiades.html から、3.5 galileo > PHP Full in one(JREあり)を 落としまして、 eclipseのPHPパースペクティブをいじっているのですが、 ・PHPエクスプローラー ・プロジェクト・エクスプローラー ・アウトライン・ビュー、プロジェクトアウトライン・ビュー これには、もともと何も書かれてないのでしょうか? 参考にしている書籍にはsample project、Sample class、と書かれていて、ファイルとプロジェクトが階層的に並んでいます。 書籍ではそこから、ナビゲーター ⇒ ファイルを右クリックしてアプリケーションを開く ⇒ エディターの選択 のように説明がされているのですが、エディターの選択すらまだ確認できていない状況です。 様々なものが同梱されているファイルですし、 PDTも内蔵されているものをダウンロードしましたので、何の問題もないと思うのですが。 初心者で大変いきづまっております。どうかご教授下さい。

    • ベストアンサー
    • PHP
  • protectedメソッドが使用できる範囲

    protectedメソッド(もしくはコンストラクタ)はサブクラスからであればアクセスできると覚えていたのですが、以下のような使い方だとサブクラスから見えなくなるようです。 サブクラスでも別パッケージからは参照できないのでしょうか。 ------------------------- package sample.a; import sample.b.*; public class Main2 { public Main2() { } protected Main2(int a){ }     protected void hoge(){ } } -------------------------- package sample.b; public class Main extends Main2{ public void hoge(){ Main2 m2 = new Main2(1);//ここでエラー m2.hoge(); //この使い方もエラー } } -------------------------------

    • ベストアンサー
    • Java
  • protectedなのにアクセスできないのは何故 その2

    PHP初心者というより、 これはプログラム初心者と言うべきでしょうか。 もう1度同じ内容の質問をします。 それだけ物凄く困っています。 どうか手助けをお願い致します。 まず、ソースコードを見て下さい。 <?php //スーパークラスfooの定義 class foo { //xはprotected protected $x = 10; //yはprivate private $y = 10; } //サブクラスhogeの定義 class hoge extends foo { public function getX(){ return $this->x; } public function getY() { return $this->y; } } $o = new hoge(); echo "x = ".$o->getX()."(メソッド経由)\n"; echo "y = ".$o->getY()."(メソッド経由)\n"; echo "y = ".$o->y."(直接参照)\n"; echo "x= ".$o->x."(直接参照)\n"; var_dump($o); ?> これだと echo "x= ".$o->x."(直接参照)\n"; の部分がエラーになるんですよね。 $oはhogeクラスでfooクラスのサブクラスですよね。 なので、 echo "x= ".$o->x."(直接参照)\n"; これが何故エラーになるのか分かりません。 ここで確認ですが、$oはhogeのインスタンスではあるが、fooのサブクラスhogeとは別物である。 この解釈でいいんでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう