2011-01-05 2 views
5

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

public interface MyInterface 
{ 

    void doSomething(<A extends MyBaseClass> arg1); 
} 

public class MyImpl implements MyInterface 
{ 
    void doSomething (SomeClassExtendsMyBaseClass arg1) 
    { 
    // do something 
    // SomeClassExtendsMyBaseClass is a class that extends MyBaseClass 
    } 
} 

я получаю синтаксическую ошибку при выполнении указанных выше. Может ли кто-нибудь показать мне, как достичь этой цели?

Благодаря

ответ

16
public interface MyInterface<A extends MyBaseClass> 
{ 

    void doSomething(A arg1); 
} 

public class MyImpl implements MyInterface<SomeClassExtendsMyBaseClass> 
{ 
    public void doSomething (SomeClassExtendsMyBaseClass arg1) 
    { 
    // do something 
    // SomeClassExtendsMyBaseClass is a class that extends MyBaseClass 
    } 
} 
2

должно быть

<T extends MyBaseClass> void doSomething(T arg1); 
+0

+1 - Это лучшее решение, если общий тип строго ограничен одним методом. – Jeremy

+0

Нет никакого смысла в том, чтобы метод принимал аргумент типа 'T extends MyBaseClass', если вам не нужно делать что-то еще с' T', например, вернуть объект типа 'T' или ограничить другой параметр, используя этот тип , Как бы то ни было, 'void doSomething (MyBaseClass arg1)' будет более уместным. Кроме того, OP явно хочет, чтобы реализации его интерфейса могли ограничивать тип 'MyBaseClass', который принимает метод; общие методы позволяют _caller_ указывать тип. – ColinD

+0

@Colin: «если вам не нужно что-то делать с' T' »- Разве это не то, чего хочет OP? – Jeremy

8

@salexander имеет решение, но причина, вы должны сделать это, что производный класс пытается быть более конкретным, которые вы не можете делать. Причина в следующем.

MyInterface mi = new MyImpl(); 
mi.doSomething(new MyOtherClassWhichExtendsMyBaseClass()); 

В интерфейсе вы сказали, что можете принять ЛЮБОЙ MyBaseClass, поэтому вам нужно это почтить.

В решении @ salexander будет выглядеть код.

MyInterface<SomeClassExtendsMyBaseClass> mi = new MyImpl(); 
mi.doSomething(new MyOtherClassWhichExtendsMyBaseClass()); // compile error. 
+1

+1 для объяснения. – jaydel

Смежные вопросы