java中该怎么创建自定义泛型的对象呢? 在方法上定义一个泛型 该怎么创建这个泛型的对象呢?

CielSwift 发布于 02/10 11:32
阅读 230
收藏 1

mybatis 的selectOne() 方法就是这样来返回任意值的,但是mybatis是怎么创建这个E 泛型的对象的呢?

加载中
0
tcxu
tcxu

由于 e 为空:E e= null;  因此 e 不能最为 引荐:e.getClass()...., 所以报错。
getClass()是Class类的方法, 而 Class类是Object的子类。

tcxu
tcxu
回复 @CielSwift : 我也正期待着高人指点。
CielSwift
CielSwift
我知道,注释上已经写了; 我想知道该怎么创建对象呢?
0
tcxu
tcxu
import java.io.*;
import java.lang.*;
public class X{
public static void main(String args[]){
    Y y= new Y();
    Integer s = y.getE();
    System.out.println(s);
	}
}

class Y {
	public <E> E getE() {
		Object o = new Object();
	   try {		
		E e =  (E)o.getClass().getConstructor().newInstance();
		return e;
		}catch(Exception e1){
			e1.printStackTrace();
			return null;
			}
		}
}

以上代码用jdk1.8编译,编译通过,但是有以下警告:

D:\java\test\OS_China>javac X.java -Xlint:unchecked
X.java:16: 警告: [unchecked] 未经检查的转换
                E e =  (E)o.getClass().getConstructor().newInstance();
                                                                   ^
  需要: E
  找到:    CAP#1
  其中, E是类型变量:
    E扩展已在方法 <E>getE()中声明的Object
  其中, CAP#1是新类型变量:
    CAP#1从? extends Object的捕获扩展Object
1 个警告

D:\java\test\OS_China>

 

CielSwift
CielSwift
我试试,但是obj强转为e类型应该会出错把;
0
夏渚汐风
夏渚汐风

可怕,java都不熟悉

0
Shazi199
Shazi199

给getE()加上参数,getE(Class<E> class)

Shazi199
Shazi199
回复 @CielSwift : 既然看了源码,那你应该知道mybatis实际上并没有用到泛型的实际类型。泛型在编译后是被类型擦除的,除非给出泛型的对象,否则无法确定泛型的实际类型。
CielSwift
CielSwift
mybatis的源码中没有这个参数,所以我也没有加;
返回顶部
顶部