2016-08-19 16 views
3

自分のクラスをライブラリクラス(org.jsoup.nodes.Node)に拡張する必要があります。 スーパークラスは抽象メソッドであり、抽象メソッドを含んでいます。私の問題は、これらの抽象メソッドの中には修飾子がないものがあることです。つまり、デフォルトではアクセス権がなく、それらをオーバーライドできません。私はそれをしようとすると、私はこのメッセージを持っている:java - クラスをライブラリスーパークラスに拡張する

方法は

がどのように私はこの問題を解決することができ、そのスーパークラスからメソッドをオーバーライドしないのですか?

答えて

3

アクセス修飾子を持たないメソッドは、package-privateです。参照するクラスをサブクラス化する唯一の方法は、パッケージorg.jsoup.nodesでクラスを宣言することです。そのため、同じパッケージに含まれています。

package org.jsoup.nodes; 

class MyNode extends Node { 
    // ... 
} 

あなたが実際に行うことを妨げるものはありません。

しかし、クラスがpackage-privateメンバーを宣言していることを考えると、おそらくライブラリの外にサブクラス化されているわけではありません。

+0

お返事ありがとうございます。私のプロジェクトに追加したこのライブラリは読み取り専用アクセスですが、パッケージにJavaクラスを追加できないと思いますか? – TheDahaka

+0

@TheDahaka:ライブラリへの「読み取り専用アクセス」が何を意味するのか分かりません。制限されていないパッケージにクラスを追加することができます。私は*唯一の制限されたパッケージは 'java.lang'だと思うが、私はJLSでそれを見つけることができない。 –

+0

@ T.J.Crowderはソースjar( 'jsoup-1.9.2-sources.jar'のようなもの)をダウンロードしてそれを変更することはできませんか?それは有効ですか? –

-2

宣言で拡張する必要がある場合は、ここで行うことはほとんどありませんが、スーパークラスメソッドの可視性を変更するか、独自のクラスをスーパークラスパッケージに移動します。デフォルトでは、すべてのJavaメソッドは、パッケージはそれらを使用することができます。ランタイム呼び出しがニーズに合っている場合は、リフレクションを試すこともできます。

+1

それは間違っています。デフォルトでは、すべてのJavaメソッドは**保護されていません**。 –

+0

修飾子がない場合、メソッドはprotectedとしてコンパイルされます –

+1

'Default'アクセス指定子は' protected'と異なります。この回答を一度ご覧ください:http://stackoverflow.com/a/31413248/2815219 –