java 泛型 T的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 泛型 T的类型相关的知识,希望对你有一定的参考价值。

我定义了

class A<T>
class B
B b = new B();
希望产生这样的效果
A<B> a = new A<B>();

但是要让上面这条语句具有普遍适用性,我希望改成下面这样

A<b.getClass()> a = new A<b.getClass()>();
即对任何类型(B、C、D……),上面的语句都能成立

实际中,在b.getClass()中却发生错误,不能调用getClass()函数。

请问应该如何解决?

非常感谢!

"<T>"可以代表任意类型的。
解释: “<T>”是泛型的默认值,可以被任意类型所代替,如:
List<String> list = new ArayList<String>();这个就定义了一个String类型的数组,那么T的类型就是字符串。
List<T> list = new ArayList<T>();之后也有可以:list.add("StringBatch");
这个时候T的类型也是String。也就是说T是动态的,可以被任意指定类型。
参考技术A

T要求的是定义的类型,不能是类的实例,你调用getClass方法,会返回一个Class类的实例,当让会报错了。

另外

class A<T>

这种模式本身就支持 A<B>,A<C>,A<D>,A<...>等等等,你为什么要改呢?

追问

在不同的源文件中,有如下实例:
B b = new B();
C b = new C();
我希望让这一条语句可以分别实现上述两个的泛型,而不用改代码,类似于
A a = new A();

在第一个源文件中实现的就是B类型
在第二个源文件中实现的就是C类型
请问应如何修改?
getClass()返回的A的类型类,不等于A的类型,是吗?
那么我应该用什么函数?

追答

getClass()试返回一个Class类的实例,然后该实例是用来描述B类的,也就是说,这里直接用
A a = new A();就行

追问

如果这样,将该语句用在其他地方还要修改代码,将Class分别换成B、C……不具有普遍适用性了。
而且我打印了a.getClass().getName(),并将输出的结果直接放在中,成功执行。应该不是类型类的错误吧?

追答

List你这么写的?能通过编译?

追问

System.out.println(a.getClass().getName());

追答

哦,你这么写的啊
System.out.println(a.getClass().getName()); 得到了一个字符串B,然后你在程序里这么写
A a = new A ();
这个和单独写 A、A、A、A、A有什么区别么,这就能通用了,开玩笑吧

本回答被提问者和网友采纳
参考技术B A这个类是集合还是什么?还有,不可以用泛型构造对象,这样是错误的。泛型,即在程序编码中一些包含参数的类。其参数可以代表类或对象等等。好好想想你理解的和你老师要求的是不是有偏差 参考技术C 既然被称作泛型,这个T就不是特指某一类型。
这个T用来代表所有的类型
参考技术D 泛型就是泛指任何类型,T可以是String、Integer或者任何类型

Java重要技术(19)泛型之泛型的使用方法

1.1. 泛型的用法

参数化类型比如Sample<T>中的类型参数T可以用于构造函数的参数的类型,方法的返回值的类型,画着方法的参数的类型,属性字段的类型等。

public class GenericParameterTest {

 

//参数化类型T,可以为String,Integer等引用类型。

static class  Sample<T> {

public Sample(T obj){

this.obj = obj;

}

 

//参数化类型作为返回值的类型。

public T work(){

System.out.println("work:"+this.obj);

return this.obj;

}

 

//参数化类型作为参数的类型。

public void update(T obj){

this.obj = obj;

}

 

 

//参数化类型作为属性的类型。

private T  obj;

 

}

 

public static void main(String[] args) {

 

//正确用法。T是String。

Sample<String>  sample = new Sample<String>("Hello");

String obj = sample.work();

sample.update("world");

obj = sample.work();

System.out.println(obj);

 

//语法错误。错误用法。

//Sample<int>  anotherSample = new Sample<int>(1);

 

//正确用法。T是Integer.

Sample<Integer> anotherSample = new Sample<Integer>(1);

 

 

}

 

 

 

 

运行结果如下:

work:Hello

work:world

world

 

以上是关于java 泛型 T的类型的主要内容,如果未能解决你的问题,请参考以下文章

java泛型转换

javapoet添加泛型参数问题,怎么解决

请教关于java的泛型方法

请教关于java的泛型方法

Java泛型中T和问号(通配符)的区别

关于Java泛型的类型擦除机制问题求教