gpt4 book ai didi

java - java中如何获取参数化类的类对象

转载 作者:行者123 更新时间:2023-12-01 11:03:37 26 4
gpt4 key购买 nike

我正在尝试做这样的事情:-

public interface Parseable {
String execute();
}
public interface Adaptable<P> {
String execute();
}
public class Parser1 implements Parseable{

@Override
public String execute() {
return "Parser1";
}

}
public class Parser2 implements Parseable{

@Override
public String execute() {
return "Parser2";
}

}
public class Adapter1<P extends Parseable> implements Adaptable<P>{
private P p;

public Adapter1(Class<Parseable> clazz){
try {
p=(P) clazz.newInstance();
} catch (InstantiationException ex) {
Logger.getLogger(Adapter1.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Adapter1.class.getName()).log(Level.SEVERE, null, ex);
}
}

@Override
public String execute() {
return "Adapter1 "+p.execute();
}

}
public class Adapter2<P extends Parseable> implements Adaptable<P>{
private P p;

public Adapter2(Class<Parseable> clazz){
try {
p=(P) clazz.newInstance();
} catch (InstantiationException ex) {
Logger.getLogger(Adapter2.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Adapter2.class.getName()).log(Level.SEVERE, null, ex);
}
}

@Override
public String execute() {
return "Adapter2 "+ p.execute();
}

}
public class HelloGenerics<T extends Adaptable, P extends Parseable> {
private T t;
private P p;
public HelloGenerics(Class<T> clazz, Class<P> clz){
try {
t=(T) clazz.getConstructors()[0].newInstance(clz);
p=(P) clz.getConstructors()[0].newInstance();
} catch (InstantiationException ex) {
Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(HelloGenerics.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
HelloGenerics<Adapter1<P>, Parser1> h1;
h1 = new HelloGenerics<>(Adapter1<P>.class, Parser1.class);
h1.t.execute();
}

}

但这似乎不可能,因为 netbeans 正在将 main 中的行标记为预期的错误提示。这只是我为学习反射而编写的演示代码,因此问题本质上纯粹是学术性的,其主要目的是学习如何获取参数化类的类对象。我实际上想做的是使类(class)可以互换。例如。我应该能够根据需要将 Parser1 或 Parser2 传递给任何一个适配器。提前致谢。

最佳答案

使其成为一个具体的类。

public Adapter1(Class<P> clazz){
try {
p = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException ex) {
Logger.getLogger(Adapter1.class.getName()).log(Level.SEVERE, null, ex);
}
}

关于java - java中如何获取参数化类的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com