Неуниверсальный конструктор в универсальном классе в Java - PullRequest
0 голосов
/ 19 мая 2019

Я создаю класс Graph для представления неориентированных графов.В конце концов, он сможет читать и анализировать файлы (например, в формате Newick или DOT), поэтому в идеале имена вершин в графах должны быть либо строками, либо целыми числами, с использованием обобщений в качестве удобного решения.

Указывается, что класс имеет конструктор, который принимает целое число в виде числа вершин и двойное число для вероятности создания ребра между любыми двумя узлами.Затем он должен создать рандомизированный граф из этой информации, и здесь я столкнусь с проблемами с генериками.Граф представлен списком смежности, который нужно «заставить» принимать целые числа в качестве имени вершин.Возможно ли иметь один неуниверсальный конструктор в этом универсальном классе в Java?

Одно из решений - полностью пропустить дженерики и перейти только к строковым именам узлов, но меня немного интересует, возможно ли это сделать или нет!

1 Ответ

2 голосов
/ 19 мая 2019

Да, это возможно. Но я бы не рекомендовал это делать. Вот почему:

Краткий ответ:

MyGeneric mg = new MyGeneric(); такой же как MyGeneric<Object> mg = new MyGeneric<>();

Длинный ответ:

    ArrayList a = new ArrayList();

    a.add("somestring");
    a.add(15);
    a.add(new ArrayList());
    a.add(new Button());

    for(int i = 0; i < a.size(); i++){
        System.out.println(a.get(i).getClass());
    }

вывод:

класс java.lang.String

класс java.lang.Integer

класс java.util.ArrayList

класс java.awt. Кнопка

Теперь вы можете положить что угодно. это потому, что он автоматически устанавливает тип объекта. Чтобы использовать, например, Методы класса String на объекте, вам нужно сначала привести его к String.

Если вы установите тип списка массивов, например, Строка (ArrayList<String> a = new ArrayList<>();), вам не разрешено помещать только что-нибудь, что расширяет Obejct (что означает буквально что угодно) на ваш контейнер.

...