Принуждение Groovy к интерфейсу неизвестно во время компиляции

Некоторое время назад я спросил, как заставить класс реализовать интерфейс, который это не реализуется декларацией.

Одна из возможностей - as-принуждение:

interface MyInterface {
  def foo()
}

class MyClass {
    def foo() { "foo" }
}

def bar() {
    return new MyClass() as MyInterface
}


MyInterface mi = bar()
assert mi.foo() == "foo"

Теперь, когда я пытаюсь использовать его, я не знаю, какой интерфейс нужен во время компиляции. Я пробовал использовать такие дженерики:

interface MyInterface {
  def foo()
}

class MyClass {
    def foo() { "foo" }
}

class Bar {
    public static <T> T bar(Class<T> type) {
        return new MyClass() as T
    }
}


MyInterface mi = Bar.bar(MyInterface.class)
assert mi.foo() == "foo"

Но возникает следующее исключение:

Cannot cast object 'MyClass@5c4a3e60' with class 'MyClass' to class 'MyInterface'

Как я могу принудительно перейти к интерфейсу, который известен только во время выполнения?


person Erik Hofer    schedule 26.01.2017    source источник
comment
Добавьте ключевое слово as при преобразовании Bar.bar (MyInterface.class) как MyInterface   -  person WyMuT_CoCHa    schedule 26.01.2017
comment
Мне также нужно иметь возможность вызывать bar из кода Java, поэтому он уже должен возвращать правильный тип.   -  person Erik Hofer    schedule 26.01.2017