有没有办法在编译时确保java中的类型安全而不使用泛型

有没有办法在编译时确保java中的类型安全而不使用泛型,java,generics,compile-time,type-safety,Java,Generics,Compile Time,Type Safety,我正在使用旧版本的JavaSDK编写一个java应用程序,它不支持泛型。那么,如何确保编译时的类型安全呢。我可以使用instanceof()。但是,它确实确保了运行时类型的安全性。请提供您的建议。您需要使用抽象/接口(即通过使它们都实现相同的接口来限制事物),或者您需要使用泛型 没有太多其他选项,这正是泛型所要解决的问题。您需要使用抽象/接口(即通过使它们都实现相同的接口来限制事物),或者需要使用泛型 没有太多其他选项,这正是泛型所要解决的问题。在糟糕的旧时代,集合和映射通常填充在一个类中,其方

我正在使用旧版本的JavaSDK编写一个java应用程序,它不支持泛型。那么,如何确保编译时的类型安全呢。我可以使用instanceof()。但是,它确实确保了运行时类型的安全性。请提供您的建议。

您需要使用抽象/接口(即通过使它们都实现相同的接口来限制事物),或者您需要使用泛型


没有太多其他选项,这正是泛型所要解决的问题。

您需要使用抽象/接口(即通过使它们都实现相同的接口来限制事物),或者需要使用泛型


没有太多其他选项,这正是泛型所要解决的问题。

在糟糕的旧时代,集合和映射通常填充在一个类中,其方法公开正确的类型。因此,要创建一个“类型安全”的整数列表,您可以执行以下操作:

class IntegerList {
    private final List delegate = new ArrayList();

    public boolean add(Integer i) {
        return delegate.add(i);
    }

    public Integer get(int index) {
        return (Integer) delegate.get(i);
    }

    public Iterator iterator() {
        return delegate.iterator();
    }

    // etc
}
当然,您必须使用非类型安全的
迭代器
,但您可以使用另一个类似的
整数迭代器
来实现这一点。请注意,这基本上就是泛型自动为您做的事情


为什么要使用如此过时的JDK?

在糟糕的旧时代,集合和映射通常填充在一个类中,其方法公开正确的类型。因此,要创建一个“类型安全”的整数列表,您可以执行以下操作:

class IntegerList {
    private final List delegate = new ArrayList();

    public boolean add(Integer i) {
        return delegate.add(i);
    }

    public Integer get(int index) {
        return (Integer) delegate.get(i);
    }

    public Iterator iterator() {
        return delegate.iterator();
    }

    // etc
}
当然,您必须使用非类型安全的
迭代器
,但您可以使用另一个类似的
整数迭代器
来实现这一点。请注意,这基本上就是泛型自动为您做的事情



为什么要使用如此过时的JDK?

在每一个收藏或地图中使用
对象
是安全的,我怀疑您是否能找到解决方案。因此引入了泛型。顺便说一下,
instanceof
是一个操作符,而不是一个方法。你永远不能让编译器以某种方式运行。要么在编译时检查泛型,要么在运行时使用
instanceof
。谢谢yoy Mena和Nikhil@Mena-很好的观察。在每个收藏或地图中使用
Object
s是安全的,我怀疑您是否能找到解决方案。因此引入了泛型。顺便说一下,
instanceof
是一个操作符,而不是一个方法。你永远不能让编译器以某种方式运行。要么在编译时检查泛型,要么在运行时使用
instanceof
。谢谢yoy Mena和Nikhil@Mena-很好的观察。我认为如果不向get方法添加强制转换操作,您的代码将无法编译。但是,如果您真的希望编译时类型安全而不使用泛型,我会复制/粘贴ArrayList代码,并显式地将类型参数(T)更改为您正在使用的任何类型(Integer)。@emory您是对的。代码只是一个展示策略的示例。谢谢Matt Ball。我正在从事的项目是一个非常旧的项目,使用旧的JDK编码。因此,我需要在不干扰其他部分的情况下对代码进行一些修改。我认为如果不向get方法添加cast操作,您的代码将无法编译。但是,如果您真的希望编译时类型安全而不使用泛型,我会复制/粘贴ArrayList代码,并显式地将类型参数(T)更改为您正在使用的任何类型(Integer)。@emory您是对的。代码只是一个展示策略的示例。谢谢Matt Ball。我正在从事的项目是一个非常旧的项目,使用旧的JDK编码。因此,我需要在不干扰其他部分的情况下对代码进行一些修改。您能否分享一个简单的代码片段,说明如何限制使它们都实现相同的接口/抽象类。最简单的方法是按照Matt Ball的建议,您将集合包装在一个实用程序类中,并让实用程序类接受一个特定的接口。我以为你是想找其他的解决办法。如果是,请分享一个例子。这对其他人也会有帮助。请分享一个简单的代码片段,说明如何限制事情,使它们都实现相同的接口/抽象类。最简单的方法是按照Matt Ball的建议,您将集合包装在一个实用程序类中,并让实用程序类接受一个特定的接口。我以为你是想找其他的解决办法。如果是,请分享一个例子。这对其他人也有帮助。