21

新しいメソッドを追加した匿名クラスのオブジェクトをインスタンス化しました。

Date date = new Date() {
    public void someMethod() {}
}

次のような形で外部からこのメソッドを呼び出すことができるかどうか疑問に思っています。

date.someMethod();
4

6 に答える 6

31

良い質問。答えはノーです。直接呼び出すことはできませんdate.someMethod();
。まず、これが何であるかを理解しましょう。

Date date = new Date()  { ... }; 

上記は、Date クラスを拡張する匿名 (名前のない) サブクラスです。

次のようなコードを見ると、

    Runnable r = new Runnable() {

        public void run() {

        }

    };

これは、Runnable インターフェイスを実装する (拡張しない) 匿名 (名前がない) クラスを定義したことを意味します。

上記の場合、スーパークラスはクラスで定義されていないため、呼び出すと呼び出すことがdate.someMethod()できませ。単純なオーバーライド規則に従います。someMethodsuperclass.Date

それでも電話をかけたい場合someMethodは、次の手順を実行します。

最初の方法>
参照変数 ' date' を使用する
date.getClass().getMethod("someMethod").invoke(date);

2番目の方法>
Dateクラスのオブジェクトの新しく作成された匿名サブクラスを使用。

new Date() 
{
    public void someMethod() {
          System.out.println("Hello");
    }
}.someMethod();   //this should be without reference 'date'
于 2013-03-20T16:22:11.347 に答える
9

基本的にいいえ。

しかし、この醜さはそれを行うことができます...

Date date = new Date() {
  public Date someMethod() { 
     //do some stuff here
     return this;
  }
}.someMethod();

ただし、これとは別に、次のように、リフレクションのみを使用してそのメソッド (親クラスには存在しない) を呼び出すことしかできません。

date.getClass().getMethod("someMethod").invoke(date);

(わかりやすくするために、try-catch は省略しています...)

しかし、真剣に、これをしないでください!私が作業しなければならないコードベースでこれに出くわしたら、このコードを書いた人に嫌われていると感じるでしょう。

于 2013-03-20T15:20:14.060 に答える
8

リフレクションを使用しないとできません。メソッドは Date API の一部ではなくdate、コンパイラに関する限り日付のみです。

使用できる唯一の方法someMethodは、新しく作成されたインスタンスで直接呼び出すことです。

new Date() { public void someMethod() { } }.someMethod();
于 2013-03-20T15:19:51.067 に答える
2

いいえ、それがメソッドローカルクラスの目的です。

 class MyDate extends Date() {
   public void someMethod() {...}
 }
 MyDate date = new MyDate();
 date.someMethod();
于 2013-03-20T15:21:32.233 に答える
1

I don't know why you would do this, but as written it is not possible, because Date does not declare someMethod.

However you can declare a local class inside the method, e.g:

void foo ( )
{
  class MyDate extends Date
  {
     public void someMethod( );
  }

  MyDate date = new MyDate( );

  date.someMethod( );
}

Once again, I would suggest using a normal class first, because local classes, by their nature, cannot be tested.

于 2013-03-20T15:20:59.020 に答える