Как вызвать метод get универсального типа? - PullRequest
0 голосов
/ 29 октября 2019

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

Я провел небольшое исследование и позволил T расширить некоторый интерфейс. может помочь. example1 example2

  1. Но каков точный интерфейс, который я должен расширить для метода get ?

  2. Как я могу найти этот интерфейс в IDE? Чтобы в следующий раз я мог не спрашивать, есть ли какие-нибудь методы, отличные от get

    private static <T> ArrayList<T> trimstartend(ArrayList<T> rows,Date startdate ,Date endDate){
    
    // if the date of current row is before the startdate, remove it
    for (Iterator<T> iterator = rows.iterator(); iterator.hasNext();) {
        T row = iterator.next();
        if ((Date)row.get("Date").before(startdate) ) {    // this line doesn't compile!  Unresolved method get 
            iterator.remove();
        }
    }
    
    // if the date of current row is after the enddate, remove it
    for (Iterator<T> iterator = rows.iterator(); iterator.hasNext();) {
        T row = iterator.next();
        if ((Date)row.get("Date").after(endDate)) {        // this line doesn't compile!   Unresolved method get
            iterator.remove();
        }
    }
    
    return rows;
    }
    

На самом деле T - это hashmap. Но давайте сделаем это здесь общим.

Ответы [ 2 ]

1 голос
/ 29 октября 2019

У вас есть три варианта:

  1. Используйте такой интерфейс, как Map, который имеет метод get(). Однако это ограничило бы T значением Map, а не методом get.

  2. Используйте пользовательский интерфейс, который имеет метод get(), но поскольку Java не набирает , вам нужно расширить HashMap, чтобы он реализовал пользовательский интерфейс, что не очень удобно, особенно если вы получаете HashMap отв другом месте.

  3. Наконец, вы можете попросить пользователя предоставить функцию в качестве параметра. Может быть, что-то вроде Function<String, Date>. Для HashMap это будет просто метод get() для HashMap, но для других типов данных это может быть что-то еще.

    Ваша функция будет выглядеть примерно так: private static <T> ArrayList<T> trimstartend(ArrayList<T> rows,Date startdate ,Date endDate, Function<String, Date> dateGetter)

    И чтобы получить Date с помощью String, вам нужно будет позвонить dateGetter.apply("Date").

0 голосов
/ 29 октября 2019

Создайте интерфейс (например, Gettable) и напишите T extends Gettable.

OK, поскольку @Malt указывает, что если класс не реализует этот интерфейс, расширьте его так, чтобы новыйкласс делает:

public interface Gettable {
    Object get(String key);
}
public class GettableHashMap<K, V> extends HashMap<K, V> implements Gettable {
    @Override
    public Object get(String key) {
        return super.get(key);
    }
}
...