2017-01-26 2 views
0

Некоторое время назад я спросил, как to make a class implement an interface that it doesn't implement by declaration.Groovy принуждение к интерфейсу неизвестно во время компиляции

Одной из возможностей является as -coercion:

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 '[email protected]' with class 'MyClass' to class 'MyInterface' 

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

+0

Добавить ключевое слово «как» во время литья Bar.bar (MyInterface.class) в качестве MyInterface –

+0

мне нужно, чтобы быть в состоянии назвать 'bar' из Java кода, так что он должен вернуть правильный тип уже. –

ответ

1
interface MyInterface { 
    def foo() 
} 

interface AnotherInterface { 
    def foo() 
} 

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

class Bar { 
    static <T> T bar(Class<T> type) { 
     new MyClass().asType(type) 
    } 
} 


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

AnotherInterface ai = Bar.bar(AnotherInterface) 
assert ai.foo() == "foo" 
Смежные вопросы