Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。Java 允许对个别泛型的类型参数进行约束,包括以下两种形式(假设 T 是泛型的类型参数,C 是一般类、泛类,或是泛型的类型参数):T 实现接口 I 。T 是 C ,或继承自 C 。一个泛型类不能实现Throwable接口。(以上定义来自百度百科)
publicclassA<T> {private T b;
publicvoidsetB(T b) {
this.b = b;
}
public T getB() {
return b;
}
}
//mainMethod
A a = new A();
a.setB("String");
String b1 = a.getB();
Integer b2 = a.getB();
publicstaticvoidmain(String[] args) {
List strList = new ArrayList<>();
List intList = new ArrayList<>();
System.out.println("strList type is "+strList.getClass());
System.out.println("intList type is "+intList.getClass());
}
这里简单打印出两个List的类型信息:
strList type is classjava.util.ArrayList
intList type is classjava.util.ArrayList
java泛型通配符分为限定通配符和非限定通配符,限定通配符有 extends T>和 super T>两种,非限定通配符就是>。 extends T>限定了泛型类型必须是T以及T的子类,以此来限定泛型上边界; super T>则限定了泛型类型必须是T以及T的父类,以此来限定泛型的下边界;>则不指定泛型类型,任意类型皆可。下面我们来看下具体用法:
publicclassTestGeneric {publicstaticvoidmain(String[] args) {
List strList = new ArrayList<>();
List intList = new ArrayList<>();
strList.add("sss");
strList.add("ddd");
strList.add("aaa");
intList.add(1);
intList.add(2);
intList.add(3);
printFirst(strList);
printFirst(intList);
}
publicstaticvoidprintFirst(List> list) {
if(list.size() > 0) {
System.out.println(list.get(0));
list.add(list.get(0));
}
}
}
static class Creature{}
static class Animal extends Creature {}
static class Dog extends Animal{}
publicstaticvoidmain(String[] args) {
List extends Animal> animals = new ArrayList<>();
animals = new ArrayList();//编译成功
animals = new ArrayList();//编译成功
animals = new ArrayList();//编译失败
animals.add(new Dog());//编译错误
animals.add(new Animal());//编译错误
animals.add(new Creature());//编译错误
Creature creature = animals.get(0);//编译成功
Animal animal = animals.get(0);//编译成功
Dog dog = animals.get(0);//编译失败
}
static class Creature{}
static class Animal extends Creature {}
static class Dog extends Animal{}
publicstaticvoidmain(String[] args) {
List super Animal> animals = new ArrayList<>();
animals = new ArrayList();//编译失败
animals = new ArrayList();//编译成功
animals = new ArrayList();//编译成功
animals.add(new Dog());//编译成功
animals.add(new Animal());//编译成功
animals.add(new Creature());//编译错误
Creature creature = animals.get(0);//编译失败
Animal animal = animals.get(0);//编译失败
Dog dog = animals.get(0);//编译失败
}
Vector extends Number> x1 = new Vector();//正确
Vector extends Number> x2 = new Vector();//编译错误
Vector super Integer> y1 = new Vector();//正确
Vector super Integer> y2 = new Vector();//编译错误
原因参考通配符一节
下面程序合法吗?
class Beansuper Student> { //TODO }
编译时报错,因为 Java 类型参数限定只有 extends 形式,没有 super 形式。(Super在非方法中相当于没有限定)
下面程序有什么问题?该如何修复?
publicclassTest {publicstaticvoidmain(String[] args) throws Exception{
List listInteger = new ArrayList();
printCollection(listInteger);
}
publicstaticvoidprintCollection(Collection
限定通配符对类型进行限制,泛型中有两种限定通配符,一种是 extends T>来保证泛型类型必须是 T 的子类来设定泛型类型的上边界,另一种是 super T>来保证泛型类型必须是 T 的父类来设定类型的下边界,泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。非限定通配符 >表示可以用任意泛型类型来替代,可以在某种意义上来说是泛型向上转型的语法格式,因为 List与 List不存在继承关系。
有时面试官会用这个问题来评估你对泛型的理解,而不是直接问你什么是限定通配符和非限定通配符,这两个 List 的声明都是限定通配符的例子,List
publicstaticsuper T>> voidsort(List list)
publicstaticvoidsort(List list, Comparator super T> c)
publicstaticvoidcopy(List super T> dest, List extends T> src)
publicstatic T max(Collection extends T> coll, Comparator super T> comp)
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos