【问题标题】:using instanceof in java [duplicate]在java中使用instanceof [重复]
【发布时间】:2013-06-02 15:18:07
【问题描述】:

我正在尝试实现 s-java 编译器的变体。为此,我创建了一些代表不同变量的类。在某些时候,我想检查像 int a = b 这样的赋值行是否是合法赋值。 (b 可以是任何变量)所以我创建了一个 IntVariable a 实例,b 是一些 Variable 的一个实例,我正在检查 b instance of a 以确定是否可以将 b 实际上分配给 a。这只是instanceof 用法的一个示例,我还有一些其他情况(b 可以是字符串文字或数字),我正在使用instanceof 来查看我知道的任何选项是否存在并且是合法的确定分配是否合法。

我的问题是:是否可以不使用instanceof 以更好的方式做到这一点,或者我只能接受这样一个事实,即虽然它不那么漂亮,但它仍然有效,而其他方式要复杂得多?

编辑:

public boolean convertable(Type other) {

  if (other instanceof FloatType || other instanceof DoubleType) {
     return true;
  }

     return false;
 }

【问题讨论】:

  • 添加你当前的代码sn -p ..这样会更容易理解

标签: java instanceof


【解决方案1】:

由于您正在使用 s-java 编译器,我认为如果您获得 otherclass 对象,您可以做更多的事情

Class otherClass = other.getClass();

一旦你有了 otherClass,你可以这样做:

otherClass.getClasses()

返回一个数组,其中包含表示所有公共类和接口的 Class 对象,这些公共类和接口是此 Class 对象所表示的类的成员。

otherClass.getDeclaredClasses()

返回一个 Class 对象数组,反映声明为该 Class 对象表示的类的成员的所有类和接口。

这是参考:

Java 反射教程:http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

Java 反射 API:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

【讨论】:

    【解决方案2】:

    您还可以创建某种称为“类型”的唯一元类,它表示一种类型。 对于每种特定类型(例如 IntType、FloatType),您都可以创建一个新类。然后你的变量可以有一个 getType() 方法,它返回对特定类型的引用。现在您可以直接用“==”比较类型。然后“类型”可以有一个方法,它返回一个可以转换第一个类型的类型列表。

    例如:

    interface Type
    {
        public Collection<Type> getConvertibleTypes();
    }
    

    然后是一个 IntType:

    class IntType implements Type
    {
        public static final IntType INST = new IntType();
    
        private IntType()
        {
        }
    
        public Collection<Type> getConvertibleTypes()
        {
            Collection<Type> v = new Vector<Type>();
            v.add(FloatType.INST);
            return v;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2016-03-18
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多