2010-02-28 36 views

Respuesta

39

decir que quiere tener un genérico que devuelve void algo:

abstract class Foo<T> 
{ 
    abstract T bar(); 
} 

class Bar 
    extends Foo<Void> 
{ 
    Void bar() 
    { 
     return (null); 
    } 
} 
+11

El problema es que la clase Void existe desde jdk 1.1. – Roman

+3

Me gusta la respuesta de TofuBeer, pero Roman planteó un punto interesante allí. – whiskeysierra

+1

No está allí estrictamente para eso, fue solo el primer uso que se me ocurrió. La respuesta de reflexión es por qué fue presentada. – TofuBeer

49

También contiene Void.TYPE, útil para las pruebas de tipo de retorno con la reflexión:

public void foo() {} 
... 
if (getClass().getMethod("foo").getReturnType() == Void.TYPE) ... 
+0

+1 para señalar que se usa en reflexión para especificar el tipo de método que no tiene valor de retorno. – stacker

+0

En realidad, también hay void.class (¡minúsculas!) Que también funcionaría perfectamente en su ejemplo. Entonces Void no es necesario allí. – whiskeysierra

+8

De hecho, Void.TYPE se define como public static final Class TYPE = Class.getPrimitiveClass ("void"); que en sí mismo es void.class. – whiskeysierra

-1

Desde el Java docs:

public final class Void 
extends Object 

La clase Void es una clase de marcador de posición no implementable para h antigua una referencia al objeto Class que representa la palabra clave Java void.

static Class<Void> TYPE 

Objeto de clase que representa el tipo primitivo de Java void.

TYPE 
public static final Class<Void> TYPE 

Objeto de clase que representa el tipo de Java primitivo void.

+6

Esto es solo copiar y pegar de la documentación, no es una respuesta real. – WhyNotHugo

+0

@Hugo Eso es cierto, pero aún así encontré que esta es la respuesta más útil. Otras respuestas evitan por qué existe. Es la representación de clase de un tipo primitivo. Como entero o doble. – scottbot95

+0

También debe mencionar que el único término que habita Void es nulo. –

1

En realidad, hay un caso pragmático en el que void.class es realmente útil. Supongamos que necesita crear una anotación para los campos de clase, y necesita definir la clase del campo para obtener información al respecto (en el ejemplo, si el campo es una enumeración, para obtener una lista de valores posibles). En ese caso, se necesitaría algo como esto:

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface PropertyResourceMapper 
{ 
    public Class acceptedValues() default void.class; 
} 

para ser utilizado como esto:

@PropertyResourceMapper(acceptedValues = ImageFormat.class, description = "The format of  the image (en example, jpg).") 
private ImageFormat format; 

he utilizado esto para crear un serializador personalizado de clases a un formato propietario.

Cuestiones relacionadas