在java中使用泛型,而不是创建类型安全集合



我主要使用泛型来创建类型安全的集合。泛型的其他用途是什么?

我用它写了一个非常小的dao层:

/*
  superclass for all entites, a requirement is that they have the 
  same kind of primary key
*/
public abstract class Entity {
}
/*
  superclass for all DAOs. contains all CRUD operations and anything else
  can be generalized
*/
public abstract class DAO<T extends Entity> {
  //assuming full control over the database, all entities have Integer pks.
  public T find(Integer pk) {...}
  public void save(T entity) {...}
  public void remove(T entity) {...}
  etc...
}
/*
  Complete example of an ideal DAO, assuming that there are no special
  operations specific for the Entity.
  Note the absence of any implementation at all.
*/
public class SpecificDAO extends DAO<SpecificEntity> {}

允许在代码中使用用户创建的自定义类。

假设你发布了一个支持某种特殊功能的SDK。泛型将允许开发人员在几乎任何类的许多地方使用你的功能。

泛型的目的是减少代码重复。

另一个有趣的用法是将类型表示为Java反射框架中的变量。

特别要注意的是,java.lang.Class有一个类型参数,用来指定Class对象所代表的类。

还有其他用途,如泛型类和泛型方法。

泛型用途:

  • 编译时类型安全。
  • 避免类型转换(因此避免ClassCastException)。
  • 可读的代码。

详细说明请参考Java泛型教程

枚举是JDK中的另一个例子。基本上,每当您有两个类一起工作,但不知道具体是哪个类时,泛型就变得有趣了。

泛型是用来创建泛化类的,所以当你创建一个类时,你可以把它变成一个参数化类。稍后在创建它的对象时,您可以指定类的参数将被类型转换为哪种数据类型或类类型。此外,它还可以使类强制转换安全,以便只插入一种数据类型或类类型的元素。该技术主要用于数据结构类。

泛型允许类型作为参数在定义类、接口和方法时,泛型使类型(类和接口)成为参数。这就像在方法声明中使用的熟悉的形式参数一样。不同之处在于形式形参的输入是值,而类型形参的输入是类型。在下面的例子:使用形式参数化方法和泛型:-

class Room {
    private Object object;
    public void add(Object object) {
        this.object = object;
    }
    public Object get() {
        return object;
    }
}
public class Main {
    public static void main(String[] args) {
        Room room = new Room();
        room.add(60);
        //room.add("60"); //this will cause a run-time error
        Integer i = (Integer)room.get();
        System.out.println(i);
    }
}

上面的泛型版本:-

class Room<T> {
    private T t;
    public void add(T t) {
        this.t = t;
    }
    public T get() {
        return t;
    }
}
public class Main {
    public static void main(String[] args) {
        Room<Integer> room = new Room<Integer>();
        room.add(60);
        Integer i = room.get();
        System.out.println(i);
    }
}

在类的遗传版本中,如果有人添加room.add("60"),将显示编译时错误。

1。信息来源2. 示例取自

最新更新