2 baidu 28379135 baidu_28379135 于 2015.06.09 14:43 提问

JAVA泛型类的初始化问题

有以下类定义:
public class Test> {
public Test(){
System.out.println("success");
}
}
请问各位如何创建实例?
PS:
Test> test=new Test>();
是不行的

5个回答

caozhy
caozhy   Ds   Rxr 2015.06.09 15:08
已采纳
 /* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

class Test<U,V extends Test<U,V>> {
    public Test(){
        System.out.println("success");
    }
}

class A extends Test<String, A>
{

}

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        Test<String, A> t = new Test<String, A>();
    }
}
baidu_28379135
baidu_28379135 好吧……我承认这个方法好极了……虽然把A的定义改成public class A<U> extends Test<U, A<U>>会更好。Thanks~~
2 年多之前 回复
bdmh
bdmh   Ds   Rxr 2015.06.09 14:46
u013632755
u013632755 类名可以定义成Test>?
2 年多之前 回复
baidu_28379135
baidu_28379135 ……没看到解决方法……“泛型”两个字倒是有不少
2 年多之前 回复
danielinbiti
danielinbiti   Ds   Rxr 2015.06.09 14:48
 Test<String> test=new Test();
baidu_28379135
baidu_28379135 这个Test的定义是已知条件……
2 年多之前 回复
baidu_28379135
baidu_28379135 “和text”?目的是类似链表。
2 年多之前 回复
danielinbiti
danielinbiti 回复baidu_28379135: public class Pair2<U,V> { public static void main(String[] args) { Pair<String,String> p = new Pair(); } }
2 年多之前 回复
danielinbiti
danielinbiti 回复baidu_28379135: 你这和test是什么呢
2 年多之前 回复
baidu_28379135
baidu_28379135 报错Bound mismatch: The type String is not a valid substitute for the bounded parameter <V extends Test<U,V>> of the type Test<U,V>
2 年多之前 回复
baidu_28379135
baidu_28379135 回复danielinbiti:
2 年多之前 回复
danielinbiti
danielinbiti 回复baidu_28379135: Test<String,String> test=new Test();
2 年多之前 回复
baidu_28379135
baidu_28379135 报错Incorrect number of arguments for type Test<U,V>; it cannot be parameterized with arguments <String>
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2015.06.09 14:54

这代码就算能编译,也没法执行,会引起无限递归。
你可以说下它实际应用的场合,看看有没有别的语法代替。

baidu_28379135
baidu_28379135 回复caozhy: 确实不需要,只传一个U就能实现。不过恰好手滑写成这样了,所以很惊异。既然类的字节码能正常生成,构造器也能写,没道理不能用。
2 年多之前 回复
caozhy
caozhy 回复baidu_28379135: 需要泛型参数嵌套么?不觉得
2 年多之前 回复
baidu_28379135
baidu_28379135 应用的话,是写一个类似链表一样的数据结构。
2 年多之前 回复
baidu_28379135
baidu_28379135 会无限递归么?最后传个null就可以终止了吧。倒不是非要这么做,只是定义类的时候编译器没报错,想试一下。
2 年多之前 回复
cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.06.09 15:00

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

Netteans
Netteans 回复baidu_28379135: 擦除就变Object了
2 年多之前 回复
baidu_28379135
baidu_28379135 但是我的类编译成功了,class文件也有,擦除是一定的,虽然不知道变成什么样了。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片