2012-04-04 19 views
6

posible duplicado:
Java generics constraint require default constructor like C#limitaciones en la aplicación de interfaz en Java

que quieren establecer una restricción de tipo T que debe tener un constructor sin parámetros. En C# será como:

public interface Interface<T> where T : new() { }

Es esta característica está disponible en Java?

Actualización: ¿Hay algún truco para hacer que el tipo genérico T tenga un constructor?

+0

Pregunta graciosa en términos de interfaz java ... Interfaz con el constructor ... :) –

Respuesta

1

Respondiendo a su pregunta actualización: única clase puede tener un constructor en Java, T - es un tipo literal, no es necesario que ha de ser una clase Durante el tiempo de ejecución utilizando la reflexión puede verificar si su clase es ParameterizedType tiene un parámetro que en realidad es una clase y si tiene un constructor vacío.

5

No se puede definir la interfaz para los constructores en Java. Tampoco puedes poner otras restricciones para escribir parámetros, aparte de la varianza de tipo.

+0

Estaba diciendo esto ... = D –

+7

** Malentendido ** Esto define el constructor para el tipo genérico T y no para la interfaz. – Aliostad

0

No puede hacer esto en tiempo de compilación en Java. Creo que lo mejor que puede hacer es tratar de verificar esto en tiempo de ejecución, mediante el uso de la reflexión para hacer algo como:

public static <T> boolean hasDefaultConstructor(Class<T> cls) { 
    Constructor[] constructors = cls.getConstructors(); 
    for (Constructor constructor : constructors) { 
     if (constructor.getParameterTypes().length == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

A continuación, puede invocar esta función de la siguiente manera:

hasDefaultConstructor(String.class) => true; 
hasDefaultConstructor(Integer.class) => false; 

Si esta función devuelve falso, entonces sabrá que la clase no tendrá un constructor predeterminado, y puede lanzar una excepción o lo que sea apropiado para su aplicación.

0

Se podría hacer T extienden una clase con el constructor desea

public interface Interface<T extends Constructable>{} 

public abstract class Constructable{ 
    public Constructable(params..){ 
    } 
} 
+0

Pero la clase que hereda Constructable puede no tener un constructor predeterminado (sin parámetros). – ahanin

+0

por supuesto, al heredar no puede reducir el alcance del modificador de acceso. Si la clase padre tiene un constructor público sin parámetros, entonces todas las subclases tendrán este constructor sin los parámetros –

+1

Bueno, en realidad, esto no es cierto. No tiene nada que ver con los modificadores de acceso. El conjunto de constructores es único para cada clase en particular. Debe llamar a uno de los superconstructores en cada constructor de una clase secundaria, a menos que el padre tenga un constructor predeterminado. Supongamos que B es una subcategoría de A. A tiene un constructor predeterminado. Si defines solo el constructor B (String) en B, entonces no podrás instanciar B con solo B(). – ahanin

Cuestiones relacionadas