class在java中_如何在Java中使用Class <T>?

小编典典

我们所知道的是“ 任何类的所有实例共享该类类型的相同java.lang.Class对象 ”

例如)

Student a = new Student();

Student b = new Student();

那a.getClass() == b.getClass()是真的。

现在假设

Teacher t = new Teacher();

没有泛型,下面是可能的。

Class studentClassRef = t.getClass();

但这是错误的..?

例如)public void printStudentClassInfo(Class studentClassRef) {}可以用Teacher.class

使用泛型可以避免这种情况。

Class studentClassRef = t.getClass(); //Compilation error.

现在什么是T ?? T是类型参数(也称为类型变量);用尖括号(<>)分隔,并紧随类名。

T只是一个符号,就像在编写类文件时声明的变量名(可以是任何名称)一样。稍后,

在初始化(HashMapmap = new HashMap();)时将用有效的类名替换T

例如) class name

因此Class表示特定类类型为' T' 的类对象。

假设你的类方法必须使用未知的类型参数,如下所示

/**

* Generic version of the Car class.

* @param the type of the value

*/

public class Car {

// T stands for "Type"

private T t;

public void set(T t) { this.t = t; }

public T get() { return t; }

}

在这里T可以String用作CarName的类型

OR T可以用作modelNumber的Integer类型,

OR T可以用作有效的汽车实例的Object类型。

现在,上面是简单的POJO,可以在运行时以不同的方式使用它。

集合(例如List,Set,Hashmap)是最好的示例,它们将根据T的声明与不同的对象一起工作,但是一旦我们将T声明为String(

例如)HashMap map = new HashMap();,则它将仅接受String类实例对象。

通用方法

泛型方法是引入自己的类型参数的方法。这类似于声明泛型类型,但是类型参数的范围仅限于声明它的方法。允许使用静态和非静态通用方法,以及通用类构造函数。

通用方法的语法包括类型参数,尖括号内,并且出现在方法的返回类型之前。对于泛型方法,类型参数部分必须出现在方法的返回类型之前。

class Util {

// Generic static method

public static boolean compare(Pair p1, Pair p2) {

return p1.getKey().equals(p2.getKey()) &&

p1.getValue().equals(p2.getValue());

}

}

class Pair {

private K key;

private V value;

}

这是方法参数中使用的类型声明,该声明应在boolean此处的返回类型之前。

在下面;在方法级别不需要类型声明,因为它已经在类级别声明了。

class MyClass {

private T myMethod(T a){

return a;

}

}

但是下面是错误的,因为不能在静态上下文中使用类级类型参数K,V,Z和Y(此处为静态方法)。

class Util {

// Generic static method

public static boolean compare(Pair p1, Pair p2) {

return p1.getKey().equals(p2.getKey()) &&

p1.getValue().equals(p2.getValue());

}

}

其他有效场景

class MyClass {

//Type declaration already done at class level

private T myMethod(T a){

return a;

}

// is overriding the T declared at Class level;

//So There is no ClassCastException though a is not the type of T declared at MyClass.

private T myMethod1(Object a){

return (T) a;

}

//Runtime ClassCastException will be thrown if a is not the type T (MyClass).

private T myMethod1(Object a){

return (T) a;

}

// No ClassCastException

// MyClass obj= new MyClass();

// obj.myMethod2(Integer.valueOf("1"));

// Since type T is redefined at this method level.

private T myMethod2(T a){

return a;

}

// No ClassCastException for the below

// MyClass o= new MyClass();

// o.myMethod3(Integer.valueOf("1").getClass())

// Since is undefined within this method;

// And MyClass don't have impact here

private T myMethod3(Class a){

return (T) a;

}

// ClassCastException for o.myMethod3(Integer.valueOf("1").getClass())

// Should be o.myMethod3(String.valueOf("1").getClass())

private T myMethod3(Class a){

return (T) a;

}

// Class a :: a is Class object of type T

// is overriding of class level type declaration;

private Class myMethod4(Class a){

return a;

}

}

最后,静态方法总是需要显式声明。它不会从课堂上获得Class。这是因为类级别T与实例绑定。

2020-03-20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码将该XML转换为Map对象: ```java import java.io.StringReader; import java.util.HashMap; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XmlToMap { public static void main(String[] args) throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <java version=\"1.6.0_26\" class=\"java.beans.XMLDecoder\"> <object class=\"java.util.HashMap\"> <void method=\"put\"> <string>att_20160719180419281NEk9</string> <string>cx</string> </void> <void method=\"put\"> <string>att_20160511094248589ZKYq</string> <string>cnmm</string> </void> <void method=\"put\"> <string>att_20161018153614188aTus</string> <string>zsx;fj</string> </void> <void method=\"put\"> <string>att_20160422110906494XuEf</string> <null/> </void> <void method=\"put\"> <string>att_20160511130210612UULE</string> <string>fjyxapp;jjgjapp;wx;jd;dxjg;tb;wsjy</string> </void> <void method=\"put\"> <string>att_20160719180542840LnFm</string> <string></string> </void> <void method=\"put\"> <string>att_20160511130025203ssle</string> <string>zdgsszta</string> </void> <void method=\"put\"> <string>att_20160810131359346N0ra</string> <string>szjys</string> </void> <void method=\"put\"> <string>att_20160511130031927equg</string> <string></string> </void> <void method=\"put\"> <string>att_20160422110456036qp7Y</string> <null/> </void> <void method=\"put\"> <string>att_20160422110543585f7iI</string> <string>cpjbxx</string> </void> </object> </java>"; Map<String, String> map = xmlToMap(xml); System.out.println(map); } public static Map<String, String> xmlToMap(String xml) throws Exception { Map<String, String> map = new HashMap<>(); SAXReader reader = new SAXReader(); Document document = reader.read(new StringReader(xml)); Element root = document.getRootElement().element("object"); for (Element element : root.elements("void")) { Element keyElement = element.element("string"); Element valueElement = element.elements().get(1); String key = keyElement.getText(); String value = valueElement == null ? null : valueElement.getText(); map.put(key, value); } return map; } } ``` 该代码使用Dom4j库解析XML,并将其转换为Map对象。输出结果为: ``` {att_20160719180419281NEk9=cx, att_20160511094248589ZKYq=cnmm, att_20161018153614188aTus=zsx;fj, att_20160422110906494XuEf=null, att_20160511130210612UULE=fjyxapp;jjgjapp;wx;jd;dxjg;tb;wsjy, att_20160719180542840LnFm=, att_20160511130025203ssle=zdgsszta, att_20160810131359346N0ra=szjys, att_20160511130031927equg=, att_20160422110456036qp7Y=null, att_20160422110543585f7iI=cpjbxx} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值