Java 泛型学习 - 根据参数决定返回类型

版权声明:大家好,我是笨笨,笨笨的笨,笨笨的笨,转载请注明出处,谢谢! https://blog.csdn.net/jx520/article/details/88021164

主要就是利用参数的 class 然后判断处理的结果能否强转为参数类型。如果可以就强转返回,否则就抛锅。
obj instanceof clazz;clazz.isInstance(obj);意思一样,都是判断obj是否clazz的实例。

  • instanceof 是关键字。b instanceof TestB ; b 问:“我是不是 TestB 的实例?” 它在自己的继承链上捣腾。主要用来揪出 父类实例 不是子类型 实例的情况。
  • isInstanceClass类型的方法。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";
}

猜你喜欢

转载自blog.csdn.net/jx520/article/details/88021164
今日推荐