Как я могу сообщить компилятору, что я уверен, что у этого универсального типа есть метод 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 - это хэш-карта. Но давайте сделаем его здесь общим.

0
Luk Aron 29 Окт 2019 в 14:10
HashMap реализует интерфейс Map. Этот интерфейс содержит метод get. Вы можете написать T extends Map<…, …> или просто ? extends Map<…, …>.
 – 
MC Emperor
29 Окт 2019 в 14:18
Ваш ответ вдохновляет меня, что я могу напрямую <T extends HashMap<...,...> > мне просто нужен метод get, так что оба работают, верно?
 – 
Luk Aron
29 Окт 2019 в 15:18
Ну, во-первых, вы должны затем использовать Map вместо HashMap, это называется запрограммировать интерфейс. Во-вторых, вы не можете просто выбрать один единственный метод (например, get) для реализации в каком-либо типе; вместо этого вы определяете тип, который содержит метод.
 – 
MC Emperor
29 Окт 2019 в 15:35
Все зависит от того, чего именно вы хотите достичь и почему вы вообще хотите использовать дженерики.
 – 
MC Emperor
29 Окт 2019 в 15:37
Да, и обратите внимание, что класс Date устарел; вместо этого вам следует использовать классы из пакета java.time.
 – 
MC Emperor
29 Окт 2019 в 15:39

2 ответа

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

Хорошо, как указывает @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);
    }
}
0
Leo Leontev 29 Окт 2019 в 14:28
Только HashMap не собирается реализовывать Gettable сам по себе ...
 – 
Malt
29 Окт 2019 в 14:15
Вы можете создать подкласс HashMap, который его реализует
 – 
Leo Leontev
29 Окт 2019 в 14:16
1
Да. Вот почему это должно быть в ответе.
 – 
Malt
29 Окт 2019 в 14:16
Извините, поэтому я должен написать <T extends Gettable> или <T extends GettableHashMap>
 – 
Luk Aron
29 Окт 2019 в 15:15
Арон . Но вместо HashMap используйте GettableHashMap.
 – 
Leo Leontev
29 Окт 2019 в 15:17