Проверьте тип вектора - PullRequest
       4

Проверьте тип вектора

0 голосов
/ 27 августа 2018

Я хочу знать, держит ли Vector <String> или <Integer>.

моя функция public void printVector(Vector <?> v){

Я попробовал if(v instanceof <String>), но компилятор не допустит этого. в чем проблема?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Теоретически, вы не можете знать, из-за стирания типа . По сути, это означает, что вы не можете получить универсальный тип вектора во время выполнения.

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

Примечание : это не очень хорошая практика. Избегайте этого, если можете. И, как говорят другие, вы должны рассмотреть другие коллекции, кроме Vector.

Примечание : как правило, использование instanceof является признаком недостатка дизайна. Кроме того, это дорогостоящая операция.

Если первого элемента нет, то ваш массив пуст, так что вы можете просто удалить его.

0 голосов
/ 28 августа 2018

Как уже указывалось, стирание типа Java сделает информацию универсального типа во время компиляции недоступной во время выполнения.

Обычный обходной путь для этого - передать Class универсального параметра в качестве аргумента метода. Таким образом, вы можете проверить, был ли метод действительно передан список Customer с или Employee с:

 public void print(List<?> list, Class<?> clazz) {

    if (clazz == Employee.class) {
        // ...
    } else if (clazz == Customer.class) {
       // ...
    } else {
      // ...
    }        
}

Затем можно вызвать метод следующим образом:

 Vector<Employee> legacy = new Vector<>();
 // do stuff       
 print(legacy, Employee.class);

Обратите внимание, что использование проверок instanceof или class обычно является признаком плохого объектно-ориентированного проектирования, и в целом вы можете достичь более элегантного решения с помощью полиморфизма, то есть переопределения метода print() для различных типов объектов - - или с одним print() методом, который использует различные реализации toString() доменных объектов.

0 голосов
/ 28 августа 2018

Пример кода, который может иметь отношение:

import java.util.Iterator;
import java.util.Vector;

public class Cool {

    public static void main(String[] args) {
         Vector<Integer> v;
         v = new Vector<>(5);
         v.add(Integer.valueOf(5));
         test(v);
    }

    private static void test(Vector<?> v) {
        Iterator<?> iterator = v.iterator();
        if (iterator.hasNext()) {
            System.out.println(iterator.next().getClass());     
        }
    }
}

Это выведет класс java.lang.Integer.

Ваш метод "test" должен будет проверить тип по набору интересующих вас суперклассов (Сотрудник / Клиент / и т. Д.).

Кроме того, использование векторов обычно считается плохой практикой в ​​Java.

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