版权声明:大家好,我是笨笨,笨笨的笨,笨笨的笨,转载请注明出处,谢谢! https://blog.csdn.net/jx520/article/details/88021164
主要就是利用参数的 class
然后判断处理的结果能否强转为参数类型。如果可以就强转返回,否则就抛锅。
obj instanceof clazz;
和clazz.isInstance(obj);
意思一样,都是判断obj
是否clazz
的实例。
instanceof
是关键字。b instanceof TestB ;
b 问:“我是不是 TestB 的实例?” 它在自己的继承链上捣腾。主要用来揪出父类实例 不是子类型 实例
的情况。isInstance
是Class
类型的方法。clazz.isInstance(obj);
clazz问: “obj 是不是我的实例?”。这里的obj
丢什么类型进来都可以判断。
public class TestA {
/**
* 参数是什么类型,就返回什么类型. 如果 clazz 不是实例 obj 的接口、父类或类。
* @param clazz
* @return
* @throws Exception
*/
private static <T> T getBean(Class<T> clazz) throws Exception{
Object obj = null;
// 这一步替换成具体的逻辑代码,最后生成一个Object对象
obj = Class.forName(clazz.getName()).newInstance();
// 判断 obj 是否能强转为参数的泛型。不能强转就抛锅。
if (clazz != null && !clazz.isInstance(obj)) {
throw new Exception("obj 不是 clazz");
}
// 否则可以强转
return (T)obj;
}
private static <T> T getObj(T param) throws Exception{
Class<?> clazz = param.getClass();
// 这一步替换成具体的逻辑代码,最后生成一个Object对象
Object obj = Class.forName(param.getClass().getName()).newInstance();
// 判断 obj 是否能强转为参数的泛型。不能强转就抛锅。
if (clazz != null && !clazz.isInstance(obj)) {
throw new Exception("obj 不是 clazz");
}
// 否则可以强转
return (T)obj;
}
public static void main(String[] args) throws Exception {
TestB b = getBean(TestB.class);
System.out.println(b.name); // 我是 TestB
TestC c = getBean(TestC.class);
System.out.println(c.name); // 我是 TestC
TestB objb = getObj(new TestB());
System.out.println(objb.name); // 我是 TestB
TestC objc = getObj(new TestC());
System.out.println(objc.name); // 我是 TestC
System.out.println(b instanceof TestB); // true
System.out.println(c instanceof TestB); // true
System.out.println(b instanceof TestC); // false
}
}
class TestB {
public String name = "我是 TestB";
}
class TestC extends TestB{
public String name = "我是 TestC";
}