有没有办法在编译时确保java中的类型安全而不使用泛型
我正在使用旧版本的JavaSDK编写一个java应用程序,它不支持泛型。那么,如何确保编译时的类型安全呢。我可以使用instanceof()。但是,它确实确保了运行时类型的安全性。请提供您的建议。您需要使用抽象/接口(即通过使它们都实现相同的接口来限制事物),或者您需要使用泛型有没有办法在编译时确保java中的类型安全而不使用泛型,java,generics,compile-time,type-safety,Java,Generics,Compile Time,Type Safety,我正在使用旧版本的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的建议,您将集合包装在一个实用程序类中,并让实用程序类接受一个特定的接口。我以为你是想找其他的解决办法。如果是,请分享一个例子。这对其他人也有帮助。