2013-06-02 53 views
4

我想实现S-java编译器的变化。为此,我创建了几个代表不同变量的类。在某些时候,我要检查,如果这样int a = b的分配行是合法的分配。 (B可以是任何变量),所以我创建一个IntVariable a实例和b是一些Variable一个实例,我检查b instance of a,以确定是否B可以是实际上分为一个。这只是instanceof用法的一个例子,我还有其他一些情况(b可能是字符串文字或数字),我正在使用instanceof来查看我知道的任何选项是否存在,并且是合法的以确定任务是合法的。的instanceof在Java中

我的问题是:这可以做一个更好的方式,而不是使用instanceof或者我只需要忍受这样的事实:尽管它不那么漂亮,它仍然有效,其他方式更复杂?

编辑:

public boolean convertable(Type other) { 

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

    return false; 
} 
+0

添加您当前的代码片断..这会更容易理解 – stinepike

回答

0

既然你正在处理的S-Java编译器,我认为,如果你得到的otherclass对象,你可以做更多的事情

Class otherClass = other.getClass();

一旦你有其他类,你可以这样做:

otherClass.getClasses()

返回包含表示所有公共类和属于此Class对象所表示的类的成员的接口类的对象的阵列。

OR

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

0

您也可以建立某种形式的所谓的“类型”独特的元级的,其代表类型。 对于每一个特定类型(例如IntType上,FloatType),您可以创建一个新类。然后你的变量可以有一个getType()方法,该方法返回指定类型的引用。现在您可以直接比较类型与“==”。 “类型”,然后可以有一个梅索德它返回一个列表OD类型,其中,第一类型可以转换。

例如:

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; 
    } 
}