我怎样才能做到这一点?
public class GenericClass<T>
{
public Type getMyType()
{
//How do I return the type of T?
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试的所有东西总是返回类型Object而不是使用的特定类型.
我有;
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
是否有(简单)方法来检索列表的泛型类型?
我在Oracle的网站上读到了Java的类型擦除.
什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?
很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?
考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.
public class A {
public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)
现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.java与A.class在类路径中,javac的是足够聪明,引发警告.所以A.class 有一些类型信息存储在其中.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: …Run Code Online (Sandbox Code Playgroud) 我知道Java的泛型有点不如.Net.
我有一个泛型类Foo<T>的,我真的需要一个实例T在Foo使用参数的构造函数.如何解决Java的局限?
我有一个列表,编程如下:public class MyList<T>.有没有办法使用T变量来获取类的名称(所以我可以从内部MyList知道T是字符串,套接字等)?
编辑:没关系,在这里找到答案.
我有一个抽象类:
public abstract class RootProcessor<T> {
Class<T> clazz;
}
Run Code Online (Sandbox Code Playgroud)
我需要填写ClassT clazz;孩子RootProcessor- 每个孩子都有自己的孩子T
我发现只有一个解决方案,但它需要编译器参数 -Xlint:unchecked
public RootProcessor(){
this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
Run Code Online (Sandbox Code Playgroud)
这是最好的解决方案吗?没有我们可以这样做-Xlint:unchecked吗?
我有以下课程:
class Field<T> {
private final Class<T> type;
public Field(Class<T> type) {
this.type = type;
}
}
class Pick<V> {
private final V value;
private final Class<V> type;
public Pick(V value, Class<V> type) {
this.value = value;
this.type = type;
}
}
Run Code Online (Sandbox Code Playgroud)
和问题所涉及的类:
class PickField<T> extends Field<Pick<T>> {
public PickField(Class<Pick<T>> type) {
super(type);
}
}
Run Code Online (Sandbox Code Playgroud)
现在这似乎被编译器接受了.不幸的是,我不知道/理解如何创建一个新的实例PickField,例如 String选择.
这当然 - 不起作用:
new PickField<String>(Pick.class)
这是不允许的(我想我理解为什么):
new PickField<String>(Pick<String>.class)
那怎么办呢?或者整个方法是否以某种方式" 闻 "?
我想创建返回XML文档的Object表示的泛型函数(使用JAXB).我需要将"class"对象传递给JAXBContext构造函数,但是如何从T中获取它?
public <T> readXmlToObject(String xmlFileName, T jaxbClass) {
JAXBContext context = JAXBContext.newInstance(T.class); // T.class - here error, how to get it?
.......
}
Run Code Online (Sandbox Code Playgroud) 我有一个类:
public abstract class BaseDao<T extends PersistentObject> {
protected Class<T> getClazz() {
return T.class;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是编译器说T.class;:Illegal class literal for the type parameter T.
我怎样才能上课T?
为什么会这样?代码中的一行运行良好,而另一条相似的代码则没有.自动类型转换是否仅在某些条件下发生?我试图将gt.echoV()分配给一个对象,它运行良好; 但是当我将它分配给一个String时,同样的错误将再次出现.
public class GeneMethodTest {
public static void main(String... args) {
GeneMethodTest gt = new GeneMethodTest();
gt.<String>echoV(); //this line works well
gt.<String>echoV().getClass();//this line leads to a type cast exception
}
public <T> T echoV() {
T t=(T)(new Object());
return t;
}
}
Run Code Online (Sandbox Code Playgroud)