标签:基本 java gnu 涵盖 思想 gen 更改 位置 报错
泛型值存在于java的编译期,编译后生成字节码文件泛型是被擦除的;
实际上,Java的泛型除了类型擦除之外,还会自动生成checkcast指令进行强制类型转换。
// 定义一个List,add()可以存放Object及其子类实例
List list = new ArrayList();
list.add(123); // 合法
list.add("123"); // 合法
// 我们在编译时无法知晓list到底存放的什么数据,于是在进行强制转换时发生异常
int i = (Integer) list.get(1); // 抛出ClassCastException异常
public class ClassName<T1, T2> { // 可以任意多个类型变量
public void doSomething(T1 t1) {
System.out.println(t1);
}
}
ClassName<String, String> a = new ClassName<String, String>();
a.doSomething("hello world");
public interface InterfaceName<T1, T2> { // 可以任意多个类型变量
public void doSomething(T1 t1);
}
public class ConcreteName<T2> implements InterfaceName<String, T2> {
public void doSomething(String t1) {
System.out.println(t1);
}
}
InterfaceName<String, String> a = new ConcreteName<String>();
a.doSomething("hello world");
/**
* 创建一个指定类型的无参构造的对象实例。
* @param <T> 待创建对象的类型。
* @param t 指定类型所对应的Class对象。
* @return 返回创建的对象。
* @throws Exception
*/
public <T> T getObject(Class<T> t) throws Exception {
return t.newInstance();
}
String newStr = generic.getObject(String.class);
public <T> T getMax(T t1, T t2) {
if (t1.compareTo(t2) > 1) { // 编译错误
return t1;
} else {
return t2;
}
}
public <T extends Comparable<T>> T getMax(T t1, T t2) {
if (t1.compareTo(t2) > 1) {
return t1;
} else {
return t2;
}
}
public <T extends Serializable&Cloneable&Comparable> T getMax(T t1, T t2) {
...
}
public <T extends Object&Serializable&Cloneable&Comparable> T getMax(T t1, T t2) { // 合法
...
}
public <T extends Object&ArrayList> T getMax(T t1, T t2) { // 同时限定两个类,不合法
...
}
public <T extends Serializable&Cloneable&Comparable&Object> T getMax(T t1, T t2) { // 将类写在最后面,不合法
...
}
Generic<Ingeter>
与Generic<Number>
实际上是相同的一种基本类型。那么问题来了,在使用Generic<Number>
作为形参的方法中,能否使用Generic<Ingeter>
的实例传入呢?在逻辑上类似于Generic<Number>
和Generic<Ingeter>
是否可以看成具有父子关系的泛型类型呢?//为了弄清楚这个问题,我们使用Generic<T>这个泛型类继续看下面的例子:
public void showKeyValue1(Generic<Number> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}
Generic<Integer> gInteger = new Generic<Integer>(123);
Generic<Number> gNumber = new Generic<Number>(456);
showKeyValue(gNumber);
// showKeyValue这个方法编译器会为我们报错:Generic<java.lang.Integer>
// cannot be applied to Generic<java.lang.Number>
// showKeyValue(gInteger);
public void showKeyValue1(Generic<?> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}
public class StaticGenerator<T> {
....
....
/**
* 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明(将这个方法定义成泛型方法)
* 即使静态方法要使用泛型类中已经声明过的泛型也不可以。
* 如:public static void show(T t){..},此时编译器会提示错误信息:
"StaticGenerator cannot be refrenced from static context"
*/
public static <T> void show(T t){
}
}
标签:基本 java gnu 涵盖 思想 gen 更改 位置 报错
原文地址:https://www.cnblogs.com/frankltf/p/9760179.html