2010-03-09 12 views
6

Dado que Date tiene un método denominado "after (Date)" y Timestamp tiene un método que lo reemplaza "after (Timestamp)", ¿por qué después del método en Date en el siguiente código?Cómo funcionan los tipos de parámetros covariantes en java

La pregunta sobre los resultados inesperados se le preguntó here.

java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L); 
    java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L); 

    java.util.Date oneDate = (java.util.Date) one; 
    java.util.Date twoDate = (java.util.Date) two; 


    System.out.println("one: " + oneDate.getTime()); 
    System.out.println("two: " + twoDate.getTime()); 

    if (oneDate.after(twoDate)) { 
     System.out.println(oneDate.getTime() + " after " + twoDate.getTime()); 
    } else { 
     System.out.println(oneDate.getTime() + " not after " + twoDate.getTime()); 
    } 

resultados

one: 1266873627200 
two: 1266873627000 
1266873627200 not after 1266873627000 

Respuesta

10

sobrecargas se consideran en tiempo de compilación; las anulaciones son consideradas en el tiempo de ejecución.

de marca de hora sobrecargasafter, no anulación un método existente - para que su única oneDate.after(twoDate) está considerando los métodos en java.util.Date; Además, incluso si usa one.after(twoDate), todavía solo usa after(Date) porque el tipo de tiempo de compilación twoDate es en lugar de Timestamp.

Si llama a one.after(two) entonces que usará Timestamp.after(Timestamp).

Date.after(Date) sólo considera la milisegundos - pero Timestamp solamente pasa un número entero de segundos para el constructor de Date, por lo oneDate y twoDate tener un valor igual milisegundos en Date, a pesar de que ha pasado diferentes valores a los constructores.

Vale la pena señalar este bit en el docs for Timestamp sin embargo:

Debido a las diferencias entre la clase marca de tiempo y la clase java.util.Date se mencionó anteriormente, es recomendó que el código no ver La marca de tiempo valora genéricamente como una instancia de java.util.Date. La relación de herencia entre Timestamp y java.util.Date realmente denota la herencia de implementación, y no escribe la herencia.

suena como un uso bastante pobre de la herencia para mí, para ser honesto - pero luego de Java el mundo tiene un montón de los :(

+0

El método después de la fecha no se compara nanos –

+0

@s_t_e_v_e: Ah -. Leí un poco la salida. '! X.after (y)' no es lo mismo que 'y.after (x)' - que es lo que sugiere tu salida. –

+0

OK. Debería ser más claro ahora –

Cuestiones relacionadas