Объединение параметров универсального типа с интерфейсами в Java - PullRequest
4 голосов
/ 23 февраля 2011

Как и во многих проблемах с наследованием, мне сложно объяснить, что я хочу сделать. Но быстрый (но необычный) пример должен сработать:

public interface Shell{


    public double getSize();

}

public class TortoiseShell implements Shell{
     ...
     public double getSize(){...} //implementing interface method
     ...
     public Tortoise getTortoise(){...} //new method
     ...
}

public class ShellViewer<S extends Shell>{

     S shell;

     public ShellViewer(S shell){
         this.shell = shell;
         ...
     }

}

public class TortoiseShellViewer<T extends TortoiseShell> extends ShellViewer{

    public TortoiseShellViewer(T tShell){
         super(tShell); //no problems here...
    }

    private void removeTortoise(){
        Tortoise t = tShell.getTortoise(); //ERROR: compiler can not find method in "Shell"
        ...
    }
}

Компилятор не распознает, что я хочу использовать конкретную реализацию Shell для getTortoise(). Где я ошибся?

Ответы [ 3 ]

4 голосов
/ 23 февраля 2011

Вы хотите это:

public class TortoiseShellViewer<T extends ToroiseShell> extends ShellViewer<T>
4 голосов
/ 23 февраля 2011

Исходя из того, что вы здесь дали, проблема в том, что:

public class TortoiseShellViewer<T extends TortoiseShell> extends ShellViewer

не указывает ShellViewer (что является общим) правильно. Должно быть:

public class TortoiseShellViewer<T extends TortoiseShell> extends ShellViewer<T>
0 голосов
/ 23 февраля 2011

Что такое tShell в removeTortoise?Это экземпляр типа Shell, который находится в базовом классе ShellViewer?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...