36

最近、ダックタイピングについて聞いたばかりで、それに関するウィキペディアの記事を読みましたが、例をJavaに翻訳するのに苦労しています。これは私の理解に本当に役立ちます.

Javaでのダックタイピングの明確な例と、それをどのように使用できるかを誰かが説明できますか?

4

10 に答える 10

48

Java は設計上、ダック タイピングには適していません。あなたがそれを行うことを選択するかもしれない方法は反射です:

public void doSomething(Object obj) throws Exception {

    obj.getClass().getMethod("getName", new Class<?>[] {}).invoke(obj);
}

しかし、Groovy などの動的言語で行うことをお勧めします。

class Duck {
    quack() { println "I am a Duck" }
}

class Frog {
    quack() { println "I am a Frog" }
}

quackers = [ new Duck(), new Frog() ]
for (q in quackers) {
    q.quack()
}

参照

于 2009-07-03T15:11:59.573 に答える
11

このブログ投稿を参照してください。動的プロキシを使用して Java でダック タイピングを実装する方法について、非常に詳細に説明しています。

要約すれば:

  • ダックタイピングで使用したいメソッドを表すインターフェースを作成する
  • このインターフェースを使用する動的プロキシと、リフレクションによって基礎となるオブジェクトでインターフェースのメソッドを呼び出す実装オブジェクトを作成します (署名が一致することを前提としています)。
于 2010-05-16T08:57:21.637 に答える
7

このライブラリをチェックしてください

interface MyInterface {
    void foo();
    int bar(int x, int y);
    int baz(int x);
}

public class Delegate {
    public int bar() {
        return 42;
    }
}

DuckPrxy duckProxy = new DuckPrxyImpl();
MyInterface prxy = duckProxy.makeProxy(MyInterface.class, new Delegate());
prxy.bar(2, 3); // Will return 42.

Dynamic Proxyを使用すると、インターフェイス ダック タイピングが簡単になります。メソッド名と戻り値の型を一致させる必要があります。

于 2009-07-03T15:11:10.310 に答える
6

Java はダックタイピングを実装していません。

于 2009-07-03T15:12:03.397 に答える
1

Java での入力は公称です。互換性は名前に基づいています。ダックタイピング (または構造型付け) が Java でどのように見えるかについての例が必要な場合は、次のページを参照してください構造型付けもサポートする互換言語。

于 2009-07-03T15:17:31.183 に答える
1

通常、ダック タイピングは動的型付け言語で使用されます。継承階層に関係なく、ニーズを満たすために必要なメソッドまたはプロパティの存在を実行時に確認します。

リフレクションを使用すると見苦しくなりますが、最も近い方法は、ダック タイピングに必要な基準に一致する最小限のインターフェイスを使用することです。このブログ投稿は、コンセプトをうまく説明しています。Python、Ruby、または JavaScript でのダックタイピングの単純さの多くが失われますが、高レベルの再利用性を探している場合は、実際には Java でのかなり良いプラクティスです。

于 2009-07-03T15:19:02.397 に答える