Как правильно использовать дженерики в параметре - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть это прямо сейчас:

  public <T> void run(T x){

    if(x instanceof HashMap){
      ((HashMap<String,String>)x).put("foo","bar");
    }

  }

но я вижу это предупреждение:

enter image description here

У меня три вопроса:

  1. Кто-нибудь знает, о чем это предупреждение?
  2. Я правильно использую оператор instanceof?Есть ли лучшая / более точная проверка для использования?
  3. Есть ли какой-то способ использования обобщений, чтобы метод «знал», что такое тип, чтобы мне не приходилось приводить тип?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Это T может быть любого типа, который расширяет Object, и ваш код не является безопасным для типа.Если что-либо, кроме HashMap<String, String>, передано вам, вы можете получить ClassCastException.Но использование оператора instance of предотвратит это.Но все равно любой может отправить любой объект в ваш метод.Так что непроверенное предупреждение просто утверждает, что

Использование экземпляра мне здесь немного неловко.Скорее, если вы хотите добавить запись в существующую карту, вы можете изменить объявление вашего универсального метода следующим образом:

public <S, T extends Map<S, S>> void addEntryToMap(T x, S key, S value) {
    x.put(key, value);
}

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

0 голосов
/ 22 февраля 2019

Я не уверен, что вы пытаетесь достичь в вашем методе

public <T> void run(T x){ // Gets an unbounded T which means it can accept anything under Object.

    if(x instanceof HashMap){
      ((HashMap<String,String>)x).put("foo","bar"); // How are you so sure it is an HashMap<String,String>? It can be any HashMap,or even Object!! That is exactly why your compiler is telling it is doing an unchecked cast.
    }
  }

Это отвечает вашему первому пункту.

Второй пункт, нам нужно больше ясности в этом, чтобы объяснить.

Третий момент. В Java существует нечто, называемое стиранием типа, когда универсальный метод не может знать тип объекта во время выполнения.Вы можете перейти в класс для чтения или использовать ограниченные символы для проверки во время компиляции.

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