在Java中,如何使用另一个类型变量作为类型实例化泛型类?

时间:2014-10-14 03:38:21

标签: java java-7

Java tutorial中,我读到“一个类型变量[泛型类]可以是你指定的任何非基本类型:任何类类型,任何接口类型,任何数组类型,甚至另一种类型变量。“

换句话说,鉴于此:

class Box<T> {
    private T t;
    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

我可以这样做,如:

Box<Object> box1 = new Box<>();
Box<Serializable> box2 = new Box<>();
Box<Comparable<Object>> box3 = new Box<>();
Box<char[]> box4 = new Box<>();

但是类型变量怎么样? “另一个类型变量”在编译时甚至意味着什么?

// nothing like this works
// Box<Z> box5 = new Box<>();
// Box<<Z>> box5 = new Box<>();
// Box<Z> box5 = new Box<Z>();
// Box<<Z>> box5 = new Box<<Z>>();

3 个答案:

答案 0 :(得分:1)

我认为它指的是在另一个泛型类中使用它的情况,如下所示:

class SomeGenericClass<T> {
    Box<T> box = new Box<T>();
}

其中T是另一个类型变量,您可以像这样构造对象:

SomeGenericClass<Object> someGenericClass = new SomeGenericClass<>();

box中初始化的SomeGenericClassBox<Object>

它也可能指的是在泛型类中使用另一个通用实例,如下所示:

class Box<T> {
    ArrayList<T> arrayList = new ArrayList<>();
}

构建这样的类:

Box<Object> box = new Box<>();

ArrayList内的Box<Object>将是ArrayList<Object>

答案 1 :(得分:1)

这意味着如果你有另一个使用泛型的类,你可以将类型设置为该类的另一个类型变量,如下所示:

public class A<S>{
  private B<S>();

}

public class B<T>{
}

答案 2 :(得分:0)

我会做这样的事情

Box <T> extends SomeParametrizedClass<T>{
// class body
private List<T> someList;
}

这里有参数化的字段和超类,它们是变量类型而不是专门提供的类型。