java 泛型对象能实例化吗T t=new T()

Posted

tags:

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

java中没法得到泛型参数化类型,因为在编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,自然就不行了
泛型反射的关键是获取ParameterizedType,再调用它的getActualTypeArguments()方法获得实际绑定的类型。但注意public class BookManager<Book>是不能被反射的,因为擦拭法的缘故。只有在Superclass 或者成员变量(Field.getGenericType())等有函数返回ParameterizedType的时候才能成功反射,

你要么搞个构造函数把参数类型传进去才行
参考技术A JAVA里面API里面出现的T范型,是说你运行时候的类型,而不是T。

举个例子,譬如List.toArray
<T> T[] toArray(T[] a)
当你运行的时候写成list.toArray(new String[0])-->此时的T就是String类型,
当你写成list.toArray(new Integer[0]))--->此时的T就是Integer类型。

范型T并不特指某一特定类型,所以不能用T t = new T()
参考技术B 泛型使不能通过new的方式来实例化的 参考技术C 可以考虑下这样

T o=(T)(new Object());

C# 泛型类 构造方法中实例化T

在c#中:
public class AA<T> where T :class

public T[] t;
public AA ()

t = new T[10]; // 可以直接实例化。


public class AA<T> where T :class

public T t;
public AA ()

t = new T(); // 出错,提示: 变量类型“T”没有 new() 约束,因此无法创建该类型的实例


public class AA<T> where T :new ()

public T t;
public AA ()

t = new T(); // 成功



问题:为什么,t=new T(),需要约束。而 t = new T[10]; 不需要约束?请详细解答, 谢谢!

你好

    t = new T[10];  这句代码是【创建】一个T类型的长度为10的【数组】。

    数组中的值为全部为null。就是说创建了数组,没有创建T类型的对象。


   t = new T();这句代码是【创建】一个T类型的【对象】。

   但是T类型中可能没有无参的构造器。如:

 public class Person
    
        public Person(string name)
        
            Name = name;
        
        public string Name  get; set; 
    

使用约束

public class AA<T> where T :new ()

  就是保证T类型必须有一个无参构造器。保证对象一定能被构造。

参考技术A 泛型类:
public class MyClass<T>

public T MyElement get; set;

泛型函数:
public T ReturnElement<T>()

throw new NotImplementedException();


但是当需要对MyElement进行实例化的时候,却不能使用new(),只要添加如下代码即可进行实例化了:
泛型类:
public class MyClass<T> where T: new()

public T MyElement get; set;

public MyClass()

this.MyElement = new T();



泛型函数:
public T ReturnElement<T>() where T : new()

return new T();


在这里,where实际上对泛型类型T的一个限定或补充。如果你希望T是一个int的集合,这个集合可以是List<int>,也可以是HashSet<int>等等,只要它们都是从ICollection继承而来的,则可以添加对类型T的限定,同时要保证它还是可以实例化的:
public T ReturnElement<T>()
where T : ICollection<int>, new()

return new T();


进一步,如果希望放宽集合中元素的类型,比如只要是int,double等可比较的类型,它们都是从IComparable继承而来,则可以继续添加如下限定:
public T ReturnElement<T, S>()
where T : ICollection<S>, new()
where S : IComparable

return new T();
参考技术B 不同的T构造的方式是不同的,有点需要1000字节的内存,有的需要8字节内存。而数组不同,它只是个容器,占用内存统一是一个引用,等你给数组这个容器里添加实际内容的时候,同样需要约束,比如t = new T[10]; t[0]=new T();后一句才是真正的new了一个T,前一句只是声明容器。 参考技术C new T[10]只是声明,还没赋值,只是10个空指针,你知道不管是什么对象的指针都基本是个整数,所以和类型无关。而new是实实在在地开辟了T类型的空间。 参考技术D public T[ ] t 是数组,不需要new本回答被提问者采纳

以上是关于java 泛型对象能实例化吗T t=new T()的主要内容,如果未能解决你的问题,请参考以下文章

java泛型T和class.getName一样吗?

泛型类中,获取当前new的对象的 T的真实 类型

class A<T>where T:new()是啥意思

java泛型类的继承规则

Java初谈之泛型

java创建泛型的实例