Feeds de los foros

En la página principal de los foros encontrarás los enlaces al logo feed feed general y al de cada uno de los foros.

Subscribete para mantenerte informado de los cambios y responde a las dudas siempre que te sea posible

Buscar en el foro

Foro J2SE

feed Foro J2SE Foro: J2SE

Nuevo Tema Nuevo Tema

¿Por qué no compila este código? 04/02/2010 22:47
anonymous

¿Alguien me pude decir por qué no se compila esta clase java con la versión SDK6 de SUN?
Parece ser que con alguna versión anterior compilaba bien.

javac FileElement.java

//===== FileElement.java =========================

package org.jfm.views;

import java.io.File;

public class FileElement extends File
implements Comparable
{

public FileElement(String pathname)
{
this(pathname, false);
}

public FileElement(String pathname, boolean topFile)
{
super(pathname);
setTopFile(topFile);
}

public String toString()
{
if(isTopFile())
return "..";
else
return getName();
}

public void setTopFile(boolean topFile)
{
this.topFile = topFile;
}

public boolean isTopFile()
{
return topFile;
}

public FileElement getRootFile()
{
return getRootFile(this);
}

private FileElement getRootFile(FileElement f)
{
String parentPath = f.getParent();
if(parentPath == null)
{
return f;
} else
{
FileElement parent = new FileElement(parentPath);
return getRootFile(parent);
}
}

public int compareTo(Object o)
{
FileElement el = (FileElement)o;
if(isDirectory() && !el.isDirectory())
return -1;
if(!isDirectory() && el.isDirectory())
return 1;
else
return toString().compareTo(el.toString());
}

private boolean topFile;
}

 

 






 

 

 









#unapprove_message#
RE: ¿Por qué no compila este código? 04/02/2010 23:01
JorgeRubira

Buenas,

Posiblemente en el JDK hayan definido Comparable de la clase File como  Comparable<File> así que tienes que poner Comparable<File>

Además en el compareTo deberás cambiar Object por File.

Tras estos cambios comprueba que el código sigue funcionando como hasta ahora.

Saludos, Jorge

#unapprove_message#
RE: ¿Por qué no compila este código? 04/02/2010 23:09
anonymous

Jorge gracias por responde. Probaré haciendo lo que me dices para ver si funciona.

Perdona que esté en el foro como anónimo, pero no sé que está ocurriendo que no me deja loguearme y el administrador aun no me ha resuelto el problema.

ipadilla

 

#unapprove_message#
RE: ¿Por qué no compila este código? 04/02/2010 23:25
anonymous

Jorge,

haciendo lo que me has dicho desaparece el error y construye la aplicación, pero no me carga el árbol de directorios. ¿alguna sugerencia?

gracias 

ipadilla

#unapprove_message#
RE: ¿Por qué no compila este código? 04/02/2010 23:56
JorgeRubira

Buenas

Desconozco como tienes el código y aunque es dar palos de ciego yo probaría...

FileElement el = (FileElement)o;

Esta línea quitarla y utilizar directamente el parámetro o.

Pero como te digo, es probar por probar. Si te diese alguna excepcion imagino que sería un CastException. Si te dá algún mensaje o algo, comentalo. Si no te funciona con eso, la unica solución es depurarlo.

Saludos, Jorge

 

#unapprove_message#
RE: ¿Por qué no compila este código? 05/02/2010 00:29
anonymous

Jorge,

tu no das palos de ciego, tu sabes mucho de este tema.

haciendo lo que mes dicho funciona perfectamente, pero no entiendo por qué. Si no estoy abusando de tu buena colaboración me podrías explicar brevemente porque funciona de esta manera y no de la otra.

Muchísimas gracias

ipadilla

 

#unapprove_message#
RE: ¿Por qué no compila este código? 05/02/2010 07:00
JorgeRubira

Ha habido suerte! :)

Sobre la explicación, faltaría más! Cuando se utiliza el compareTo es porque hay un Collection.sort o algoritmo similar en algún sitio de tu código o bién del código del JDK. Pues bién, cuando cargues del disco duro los ficheros y al intentar ordenar, suponer que absolutamente todos los elementos deben de se FileElement cuando quizá el JDK lo utilice también con File puede ser propenso a errores. Quitar el Cast a FileElement te baja la probabilidad de que tu aplicación de errores y la funcionalidad es la misma porque aunque la clase sea de tipo File siempre se invoca el método que está en la clase derivada en el caso de implementarla.

Saludos, Jorge

#unapprove_message#
RE: ¿Por qué no compila este código? 05/02/2010 09:26
anonymous

Jorge muchas gracias de nuevo, me has resuelto del problema. Finalmente la clase funciona después de las correcciones y queda de la forma siguiente:

=========================================== =======

// Source File Name:   FileElement.java

package org.jfm.views;

import java.io.File;

public class FileElement extends File
        implements Comparable
{

    public FileElement(String pathname)
    {
        this(pathname, false);
    }

    public FileElement(String pathname, boolean topFile)
    {
        super(pathname);
        setTopFile(topFile);
    }

    public String toString()
    {
        if(isTopFile())
         &nbs p;  return "..";
        else
         &nbs p;  return getName();
    }

    public void setTopFile(boolean topFile)
    {
        this.topFile = topFile;
    }

    public boolean isTopFile()
    {
        return topFile;
    }

    public FileElement getRootFile()
    {
        return getRootFile(this);
    }

    private FileElement getRootFile(FileElement f)
    {
        String parentPath = f.getParent();
        if(parentPath == null)
        {
         &nbs p;  return f;
        } else
        {
         &nbs p;  FileElement parent = new FileElement(parentPath);
         &nbs p;  return getRootFile(parent);
        }
    }

    public int compareTo(File o)
    {
 //       FileElement el = (FileElement)o;
        if(isDirectory() && !o.isDirectory())
         &nbs p;  return -1;
        if(!isDirectory() && o.isDirectory())
         &nbs p;  return 1;
        else
         &nbs p;  return toString().compareTo(o.toString());
    }

    private boolean topFile;
}

=================================================

ipadilla

 

#unapprove_message#
RE: ¿Por qué no compila este código? 06/02/2010 10:38
anonymous

Pongo de nuevo la clase con una ligera mejora:

// - Haciendo el casting solo una vez en public int compareTo(File o){}

package org.jfm.views;

import java.io.File;

public class FileElement extends File
implements Comparable
{

public FileElement(String pathname)
{
this(pathname, false);
}

public FileElement(String pathname, boolean topFile)
{
super(pathname);
setTopFile(topFile);
}

public String toString()
{
if(isTopFile())
return "..";
else
return getName();
}

public void setTopFile(boolean topFile)
{
this.topFile = topFile;
}

public boolean isTopFile()
{
return topFile;
}

public FileElement getRootFile()
{
return getRootFile(this);
}

private FileElement getRootFile(FileElement f)
{
String parentPath = f.getParent();
if(parentPath == null)
{
return f;
} else
{
FileElement parent = new FileElement(parentPath);
return getRootFile(parent);
}
}
// - Haciendo el casting solo una vez.

public int compareTo(File o){
File FileElement = (File)o;
if(isDirectory() && !FileElement.isDirectory())
return -1;
if(!isDirectory() && FileElement.isDirectory())
return 1;
else
return toString().compareTo(FileElement.toString());
}
private boolean topFile;
}
 

Si alguien detecta como se puede mejorar que lo diga y añadiremos las propuestas.

Saludos

ipadilla

#unapprove_message#
RE: ¿Por qué no compila este código? 08/02/2010 19:14
JorgeRubira

Buenas

File FileElement = (File)o; >>>> File FileElement = o; (Es lo mismo)

Saludos, Jorge

#unapprove_message#
#thread_expired#.
Sun Microsystem Logo NHT-Norwick Logo

© 2002-2007 Asociación javaHispano