4

我正在尝试实现 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;
 }
4

2 回答 2

0

您还可以创建某种称为“Type”的唯一元类,它代表一种类型。对于每种特定类型(例如 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;
    }
}
于 2013-06-02T15:46:17.087 回答
0

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

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

于 2013-06-02T15:44:01.350 回答