Java: интерфейс в коллекции не распознается как параметр - PullRequest
7 голосов
/ 16 декабря 2010

Простой дизайн и простой код, но не компилируются:

public interface Insertable {
    public String getInsertStmt(String table);
}

public class ClassCanBeInserted implements Insertable { 
    public String getInsertStmt(String table) {}
}

public class SomeClass { 
    public static void main() { 
        List<ClassCanBeInserted> list = new ArrayList<ClassCanBeInserted>();
        SomeMethod(list);
    }
    private static void SomeMethod(List<Insertable> list) {}
}

И вызов SomeMethod () не будет компилироваться.Английский плохо, но код должен объяснить.Может кто-нибудь, пожалуйста, выяснить, что не так и как получить дизайн для предложения, чтобы в этом методе можно было использовать список классов, реализованных на интерфейсе?Дайте мне знать ваши вопросы.Спасибо!

Получено сообщение об ошибке: Метод SomeMethod (List) в типе ClassCanBeInserted не применим для аргументов (List)

Ответы [ 2 ]

15 голосов
/ 16 декабря 2010

List<Insertable> не является суперклассом List<ClassCanBeInserted>, хотя Insertable является суперклассом ClassCanBeInserted. Чтобы сделать то, что вы хотите, вы должны изменить подпись SomeMethod на SomeMethod(List<? extends Insertable> list).

1 голос
/ 16 декабря 2010

Поначалу это кажется нелогичным.

Полагаю, причина в том, что весь смысл дженериков состоит в том, чтобы вводить и ограничивать список на основе безопасности статических типов.

Если бы вы могли поместить любой «Insertable» в список, вы могли бы получить смесь различных типов классов.

Это означает, что ваши запросы становятся небезопасными и подвергаются риску исключений ClassCastException.

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