2010-05-06 5 views
1

terme sur la structure de type = une structure de données qui accepte différents types, peut être primitif ou défini par l'utilisateur.Java: structures sur-typées? Pour avoir plusieurs types dans Object []?

Je pense que Ruby supporte de nombreux types de structures telles que les tables. J'ai essayé une table avec les types 'String', 'char' et 'File' en Java mais errer.

  1. Comment puis-je avoir plus typé structure Java?
  2. Comment afficher types dans la déclaration? Qu'en est-il de l'initiation? Supposons une structure:

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

code

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]); 
     } 
} 

erreurs

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'; 
      ^

Après la nuisance au problème réel:

d [2] magasins de type char de type, mais les méthodes qu'il considère comme objet. Beaucoup de mes méthodes n'ont pas d'objet, donc les changer à cause de celui-ci, c'est trop.

  1. Comment puis-je changer les types avant de les donner en tant que parties?
  2. dois-je faire dans la classe de traitement séparé ou est-il prêt méthode?

code

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); 
     } 
} 
+4

Pire élection pour le nom de la classe! :-) – leonbloy

+3

Vous semblez essayer tous les BAD IDEA dans l'univers Java, un à la fois. Aujourd'hui, il déclare votre propre classe appelée 'Object' et essaie d'écrire Ruby en Java. –

Répondre

3

@nxt déjà cloué à la racine de la cause.

Mais je suggère d'oublier cette approche du tout. Envelopper les données dans une classe JavaBean comme personnalisés tels que:

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. 
} 

Ensuite, il suffit d'utiliser new MyFile() la manière habituelle de Java. Ce n'est pas seulement typé, mais aussi plus auto-documenté, réutilisable et maintenable. C'est l'approche normale d'utiliser des «structures sur-typées».

+0

bien ce qui aurait été plus cool que juste arr.toString(). Replace ("],", ":") --- doit revenir à l'ancien style :) – hhh

+1

"Javabean" est un * standard *. Il existe ** beaucoup ** d'outils de cartographie/introspection/massage Javabean. Dozer, Commons Beanutils, XStream, XMLBeans, Hibernate, JPA, les frameworks MVC, etc .. Pour sérialiser/désérialiser les données, il suffit de passer en revue 'java.io.Serializable' et ainsi de suite. – BalusC

0

'T' est un caractère primitif, il est donc pas un objet. Vous pouvez le modifier:

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

Le type de chaîne est un objet. En ce qui concerne les raisons pour lesquelles il n'accepte pas un nouvel objet File ... Je n'ai pas de bonne réponse à cela. Je viens de remarquer que votre nom de classe est Object - essayez de le changer en quelque chose d'autre (Test, MyTest, etc) - voir si cela aide.

6

Vous avez nommé votre classe objet, il est en conflit avec java.lang.Object. Donnez-lui un autre nom ou incluez le nom du paquet dans votre déclaration de tableau. par exemple.

java.lang.Object[] d = new java.lang.Object[6]; 
0

Le nom de votre classe est Object, ce qui est un très bon moyen de créer de la confusion. Renommez-le en autre chose, car le type d n'est pas java.lang.Object[] dans votre cas.Une fois que vous correctif,

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

et

d[4] = "."; 

sera parfaitement valide.

0

Faire cette répartition va être assez difficile. Le problème est que Java calcule quelle méthode envoyer à au moment de la compilation. Pour pouvoir sélectionner la méthode à utiliser, vous devez utiliser la réflexion pour effectuer une répartition dynamique. Désordonné.

Dans le cas simple, vous expédiez comme celui-ci (avec la gestion des exceptions omis):

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 

Notez que l'ajout de la gestion des exceptions vracs ceci beaucoup ; il y a beaucoup de choses qui peuvent mal tourner. C'est pourquoi la plupart des programmes Java ne sont pas écrits comme le décrit la question.

+0

BTW, je suppose que la correction de @ nxt est appliquée. –