Java - ¿Porqué no compila este código?

 
Vista:

¿Porqué no compila este código?

Publicado por ipadilla (6 intervenciones) el 04/02/2010 17:57:35
¿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;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Porqué no compila este código?

Publicado por ipadilla (6 intervenciones) el 04/02/2010 22:08:27
Perdón, me olvidé de poner el error que envía el compilador, es el siguiente:


D:\Java File Manager\jfm\src\org\jfm\views\FileElement.java:10: java.lang.Comparable cannot be inherited with different arguments: <> and <java.io.File>
public class FileElement extends File
1 error

El error lo da en esta línea:
public class FileElement extends File implements Comparable

ipadilla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Porqué no compila este código?

Publicado por Tom (1831 intervenciones) el 05/02/2010 10:28:45
http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#Can%20a%20class%20implement%20different%20instantiations%20of%20the%20same%20parameterized%20interface?

En resumen, no puedes hacer que un tipo implemente dos instancias distintas de un mismo interface.

Dado que File es Comparable, FileElement también lo es sin que lo indiques.

Prueba a quitar el "implements Comparable".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Porqué no compila este código?

Publicado por ipadilla (6 intervenciones) el 05/02/2010 19:48:17
Gracias por responder y el enlace proporcionado, probaré tu propuesta y te devolveré los resultados obtenidos.
ipadilla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Porqué no compila este código?

Publicado por ipadilla (6 intervenciones) el 06/02/2010 10:48:59
Esta versión funciona correctamente:

package org.jfm.views;

Cast varias veces:

import java.io.File;

public class FileElement extends File
implements Comparable<File>
{

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 varias veces.

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

private boolean topFile;
}

//==================

Si aun crees que se puede mejorar, no dudes en proponerlo.
Muchas gracias
ipadilla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar