otra - Java: clase de devolución(no es una instancia)
llamar un objeto desde otra clase java (9)
¿Es posible devolver en un método estático una clase? Lo explicaré...
Yo tengo:
public class A { public static void blah(){} }
public class B { }
Quiero crear un método estático en B bruja devuelve A
Entonces puedes hacer:
A.blah();
Y
B.getA().blah();
Esto, sin crear una instancia de A
Solo use sus métodos estáticos.
es posible?
Incluso si fuera posible, no será de mucha utilidad. La llamada A.blah()
no crea una instancia de A
Es un método estático sin necesidad de una instancia.
Y no puede usar interfaces para implementar métodos estáticos. Entonces, ¿para qué debería ser bueno?
La gente dice que es imposible, y eso es cierto, pero si usas la API de reflexión puedes hacer algo parecido.
Así es como puedes hacerlo.
Tienes una clase que hace esto.
public class B {
Class a
public static Class getA(){
return a;
}
}
entonces, para llamar bla, hazlo:
try{
Method m = B.getA().getDeclaredMethod("blah");
m.invoke(null);//for a static method, you can invoke on null
}
Catch(Exception e){
// see documentation for list of exceptions
}
Entonces, ¿por qué querrías hacer esto? Bueno, si lo haces de esta manera, puedes cambiar la clase A en So getA () podría devolver A, B, C o D, todos con diferentes funciones blah (). No estoy seguro de qué propósito serviría, pero si quieres hacerlo, puedes.
ver: Class.getDeclaredMethod () y Method.invoke () para más información.
No he intentado esto, por lo que es posible que deba hacer algunos ajustes.
No, esto no es posible Solo puede devolver una referencia a una instancia de una clase. Lo más cerca que puede llegar a esto es devolver una referencia a una variable de tipo Clase. La pregunta es: ¿por qué quieres esto? ¿Que problema estas tratando de resolver? Puede haber una mejor solución.
No, esto no es posible. Tienes dos opciones:
B.getA()
devuelve una instancia de A, yblah()
será un método no estático.Directamente llame a
A.blah()
.
Puede devolver un Método usando reflexión que puede invocar () más tarde. Sin embargo, parece que estás tratando de hacer algo que debería hacerse de otra manera. ¿Por qué estás tratando de hacer esto?
Si no quiere tener una instancia de A
, entonces deje que B
llame a blah()
directamente. Es decir
class B {
void blah() {
A.blah();
}
}
Voy a adivinar que la razón por la que preguntas esto es porque quieres que B devuelva muchas clases diferentes con diferentes comportamientos, no solo A.
Es probable que desee utilizar una interfaz para lo que está haciendo en su lugar.
interface IA {
void blah();
}
public class B {
IA getA1() {
return new IA {
void blah() {
...code...
}
}
}
IA getA2() {
...
}
IA getA3() {
...
}
}
myCallingMethod {
B.getA1().blah();
B.getA2().blah();
B.getA3().blah();
}
public class B {
public static A getA(){ return null; }
}
B.getA().blah(); //works!
EDITAR
Es verdad que es equivalente a
B.getA();
A.blah();
Excepto que se ven bastante diferentes. Imagina que tienes una cadena de estos.
Revisé org.apache.commons.cli.OptionBuilder
y personalmente no lo haría de esa manera, pero el autor tiene su caso. La API se usa solo al principio de un programa, en un solo hilo.
Los diseñadores de API a veces tienen que hacer algunos movimientos mágicos, no seas demasiado crítico.
Esta es una refutación de la respuesta de @ irreputable:
public class B {
public static A getA(){ return null; }
}
B.getA().blah(); //works!
"Funciona", pero probablemente no en el sentido que espera, y ciertamente no de una manera útil. Vamos a dividir esto en dos partes:
A a = B.getA();
a.blah();
La primera declaración devuelve una instancia (nula en este caso) de A
, y la segunda afirmación ignora esa instancia y llama a A.blah()
. Entonces, estas declaraciones son en realidad equivalentes a
B.getA();
A.blah();
o (dado que getA()
es libre de efectos secundarios), simplemente
A.blah();
Y aquí hay un ejemplo que ilustra esto más claramente:
public class A {
public static void blah() { System.err.println("I''m an A"); }
}
public class SubA extends A {
public static void blah() { System.err.println("I''m a SubA"); }
}
public class B {
public static A getA(){ return new SubA(); }
}
B.getA().blah(); //prints "I''m an A".
... y esto (espero) ilustra por qué este enfoque no resuelve el problema del PO.