Java: чрезмерно типизированные структуры? Иметь много типов в Object []? - PullRequest
1 голос
/ 07 мая 2010

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

Я думаю, что ruby ​​поддерживает много типов в структурах, таких как таблицы. Я пробовал таблицу с типами «String», «char» и «File» в Java, но ошибался.

  1. Как я могу иметь сверхтипированную структуру в Java?
  2. Как показать типы в объявлении? Как насчет инициализации? Предположим, структура:

          INDEX    VAR      FILETYPE
            //0 -> file     FILE
            //1 -> lineMap  SizeSequence
            //2 -> type     char
            //3 -> binary   boolean
            //4 -> name     String
            //5 -> path     String
    

Код

import java.io.*;
import java.util.*;

public class Object
{
        public static void print(char a)
        {
                System.out.println(a);
        }
        public static void print(String s)
        {
                System.out.println(s);
        }

        public static void main(String[] args)
        {
                Object[] d = new Object[6];
                d[0] = new File(".");
                d[2] = 'T';
                d[4] = ".";

                print(d[2]);
                print(d[4]);
        }
}

Ошибка

Object.java:18: incompatible types
found   : java.io.File
required: Object
        d[0] = new File(".");
               ^
Object.java:19: incompatible types
found   : char
required: Object
        d[2] = 'T';
               ^

После неприятностей с реальной проблемой:

d [2] хранит тип char, но методы видят его как Object. Многие из моих методов не имеют Object, поэтому менять их из-за этого слишком много.

  1. Как я могу изменить типы, прежде чем указывать их как парс?
  2. Должен ли я сделать это в отдельном классе обработки или есть готовый метод?

Код

package file;

import java.io.*;
import java.util.*;

public class ObjectTest
{
        //I have this kind of methods
        //I want them to work with Object
        // without changing the par type,
        // possible?
        public static void print(char a)
        {
                System.out.println(a);
        }
        public static void print(String s)
        {
                System.out.println(s);
        }

        public static void main(String[] args)
        {
                java.lang.Object[] d = new java.lang.Object[6];
                d[0] = (Object) new File(".");
                d[2] = (Object) new Character('T');
                d[4] = (Object) new String(".");

                print(d[2]);
                print(d[4]);
        }
        //I can get it this way working
        // but some of my methods are not Objects
        // and they need to be types like String
        private static void print(Object object) {
            System.out.println(object);
        }
}

Ответы [ 5 ]

6 голосов
/ 07 мая 2010

Вы назвали свой класс Object, поэтому он конфликтует с java.lang.Object.Дайте ему другое имя или альтернативно включите имя пакета в ваше объявление массива.например,

java.lang.Object[] d = new java.lang.Object[6];
3 голосов
/ 07 мая 2010

@ nxt уже уничтожил основную причину.

Но я предлагаю вообще забыть об этом подходе. Оберните данные в пользовательский Javabean-подобный класс, такой как:

public class MyFile {
    private File file;
    private SizeSequence lineMap;
    private char type;
    private boolean binary;
    private String name;
    private String path;
    // Add/generate constructors, getters, setters, equals, hashcode, toString.
    // An IDE can do that in few clicks.
}

Тогда просто используйте new MyFile() обычным способом Java. Он не только безопасен, но и самодокументирован, многократно используется и поддерживается. Это нормальный подход к использованию "чрезмерно типизированных структур".

0 голосов
/ 07 мая 2010

Выполнение этой отправки будет довольно трудным.Проблема в том, что Java определяет, какой метод отправлять во время компиляции.Чтобы выбрать способ отправки, вам нужно будет использовать отражение для динамической отправки.Грязно.

В простом случае вы будете отправлять так (без обработки исключений):

java.lang.Object arg = d[2]; // or whatever
java.lang.reflect.Method m = this.getClass().getMethod("print", arg.getClass());
m.invoke(null, arg); // first arg should be this if non-static method

Обратите внимание, что добавление обработки исключений увеличивает это лот ;Есть много вещей, которые могут пойти не так.Вот почему большинство программ на Java написаны не так, как описано в вопросе.

0 голосов
/ 07 мая 2010

Имя вашего класса - Object, это действительно хороший способ вызвать путаницу.Переименуйте его в другое, потому что тип d в вашем случае не java.lang.Object[].После того, как вы это исправите,

 d[0] = new File(".");

и

 d[4] = ".";

будут полностью действительными.

0 голосов
/ 07 мая 2010

'T' - примитивный символ, поэтому он не является объектом. Вы можете изменить это:

d[2] = new Character('T');

Тип String является объектом.

Относительно того, почему он не принимает новый объект File ... У меня нет хорошего ответа на этот вопрос с головы до головы. EDIT: Я только что заметил, что имя вашего класса - Object - попробуйте изменить его на другое (Test, MyTest и т. Д.) - посмотрите, поможет ли это.

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