【问题标题】:Is there any way to ensure type safety in java at compile time without generics有没有办法在没有泛型的情况下在编译时确保 java 中的类型安全
【发布时间】:2014-07-01 12:15:23
【问题描述】:

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

【问题讨论】:

  • 在每个集合或地图中使用Objects 是安全的,我怀疑你会找到解决方案。出于这个原因引入了泛型。顺便说一句,instanceof 是一个运算符,而不是一个方法。
  • 你永远不能让编译器以某种方式运行。它要么泛型在编译时检查,要么在运行时使用instanceof
  • 感谢 yoy Mena 和 Nikhil。 @Mena - 很好的观察。

标签: java generics compile-time type-safety


【解决方案1】:

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

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

【讨论】:

  • 您能否分享一个简单的代码 sn-p,说明如何限制事物,使它们都实现相同的接口/抽象类。
  • 最简单的方法是按照 Matt Ball 的建议,将集合包装在实用程序类中,并让实用程序类接受特定的接口。
  • 这种解决方法看起来很棒。我以为你的意思是其他一些解决方法。如果是这样,请分享一个例子。这对其他人也有帮助。
【解决方案2】:

在过去糟糕的日子里,集合和映射通常被塞进一个类中,该类的方法暴露了正确的类型。因此,要创建一个“类型安全”的整数列表,您可以执行以下操作:

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
}

当然,您会遇到非类型安全的Iterator,但您可以使用另一个类似的IntegerIterator 来实现。请注意,这基本上是泛型自动为您所做的。

你为什么要使用这么陈旧的 JDK?

【讨论】:

  • 我认为如果不向 get 方法添加强制转换操作,您的代码将无法编译。但是如果你真的想要编译时类型安全而不需要泛型,我会复制/粘贴 ArrayList 代码并将类型参数 (T) 显式更改为你正在使用的任何值 (Integer)。
  • @emory 你是对的。代码只是展示策略的示例。
  • 谢谢马特·鲍尔。我正在从事的项目是非常古老的项目,并且使用旧的 JDK 进行编码。所以,我需要在不影响其他部分的情况下对代码进行一些修改。
猜你喜欢
  • 2021-12-26
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2022-01-10
  • 2023-03-30
  • 2019-11-20
  • 2015-09-12
相关资源
最近更新 更多