Вопрос по java – Что является примером типизации утки в Java?

35

Я только недавно услышал о наборе утки, и я прочиталСтатья в википедии об этом, но мне трудно переводить примеры на Java, что действительно помогло бы мне понять.

Кто-нибудь сможет привести наглядный пример типизации утки на Java и как я могу ее использовать?

Да, но другие здесь, возможно, не читали эту статью. Wim ten Brink

Ваш Ответ

10   ответов
1

Error: User Rate Limit Exceeded

Objects are polymorphic without being related by a common base class or interface.

Error: User Rate Limit Exceeded

1

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

interface Quacking {
    void quack();
}

class Duck {
    public void quack() { System.out.println("Quack!"); }
}

class Frog {
    public void quack() { System.out.println("Ribbip!"); }
}

Quacking duck = Extenter.extend(new Duck()).as(Quacking.class);
Quacking frog = Extenter.extend(new Frog()).as(Quacking.class);

duck.quack();
frog.quack();

Error: User Rate Limit Exceeded

Quack!
Ribbip!
5

Java не реализует утку.

11

Увидетьэтот блогError: User Rate Limit Exceeded

В итоге:

  • create an interface that represents the methods you want to use via duck typing
  • create a dynamic proxy that uses this interface and an implementation object that invokes methods of the interface on the underlying object by reflection (assuming the signatures match)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdynamic proxiesError: User Rate Limit Exceededthis gistError: User Rate Limit ExceededProxyError: User Rate Limit Exceededjava.lang.IllegalArgumentException: object is not an instance of declaring class.
Error: User Rate Limit Exceeded
1

Как правило, типизация утки используется с динамически типизированными языками. Во время выполнения вы будете проверять наличие методов или свойств, необходимых для удовлетворения ваших потребностей, независимо от иерархии наследования.

Error: User Rate Limit ExceededError: User Rate Limit Exceeded делает хорошую работу, описывая концепцию. Он теряет большую часть простоты утиной печати на python, ruby или javascript, но на самом деле это довольно хорошая практика в Java, если вы ищете высокий уровень повторного использования.

1

Error: User Rate Limit ExceededError: User Rate Limit Exceeded.

Error: User Rate Limit Exceeded

interface Bird {
    void fly();
}

interface Duck extends Bird {
    void quack();
}

class PseudoDuck {
    void fly() {
        System.out.println("Flying");
    }

    void quack() {
        System.out.println("Quacking");
    }
}

class Tester {
    @Test
    void testDuckTyping() {
        final Duck duck
                = DuckTyper.duckType(new PseudoDuck(), Duck.class);
    }
}

Error: User Rate Limit ExceededallError: User Rate Limit Exceeded

3

С Java 8 у вас есть 2 способа:

Error: User Rate Limit Exceeded

static interface Action { public int act(); }

public int forEachAct(List<Action> actionlist) {
   int total = 0;
   for (Action a : actionList)
       total += a.act();
}

public void example() {
    List<Action> actionList = new ArrayList<>();
    String example = "example";
    actionList.add(example::length);
    forEachAct(actionList);
}

Error: User Rate Limit Exceeded

static interface Action {
    public int act();
    public String describe();
}

public void example() {
    List<Action> actionList = new ArrayList<>();
    String example = "example";

    actionList.add(new Action(){
        public int act() { return example.length(); }
        public String describe() { return "Action: " + example; }
    });
}
1

Типизация на Java является номинальной - совместимость основана на именах. Если вам нужны примеры того, как типизация утки (или структурная типизация) может выглядеть в Java, посмотрите эту страницу:Error: User Rate Limit ExceededError: User Rate Limit Exceeded

43

Error: User Rate Limit Exceeded

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()
}

Ссылка

Error: User Rate Limit Exceededcode.google.com/p/duckapter
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
6

проверить эту библиотеку:

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.

Error: User Rate Limit ExceededДинамический проксиError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Похожие вопросы