2014-12-05 57 views
3

项枚举假如我有几个特定的​​类,所有扩展一个抽象类,像这样:(?相关)创建相关的类

public abstract AbstractClass { 
    // abstract stuff here 
} 

public FirstSpecificClass extends AbstractClass { 
    // specific stuff here 
} 

public SecondSpecificClass extends AbstractClass { 
    // specific stuff here 
} 

我需要在其他地方创建一个enum,其中每个条目连接与一个特定的类;为此,我将特定类作为构造函数参数传递并将其作为私有字段存储在枚举中(我也为该字段提供了一个getter方法)。我还需要创建一个静态方法,它将某个特定类的实例作为参数并返回适当的枚举元素(或null)。我将通过遍历每个枚举条目并将instanceof与前面提到的专用字段的getter结合使用来完成此操作。这是我的尝试:

public enum Types { 
    FIRST(FirstSpecificClass.class), // line 2 
    SECOND(SecondSpecificClass.class); // line 3 

    private Class<AbstractClass> classType; 

    private Types(Class<AbstractClass> classType) { 
    this.classType = classType; 
    } 

    public Class<AbstractClass> getClassType() { 
    return this.classType; 
    } 

    public static Types fromTypeInstance(AbstractClass instance) { 
    for(Types t : Types.values()) 
     if(instance instanceof t.getClassType()) return t; // line 17 
    return null; 
    } 
} 

我似乎误解了如何将类类型存储为一个字段,以便它可以在instanceof检查后返回和使用。这个代码是生产几种编译时错误:

  • (2枚举的线):构造Types(Class<FirstSpecificClass>)未定义
  • (枚举的3线):构造Types(Class<SecondSpecificClass>)未定义
  • (线枚举的)17:数不兼容类型booleanClass<AbstractClass>

我不是通常是一个Java程序员,和我的泛型的理解和instanceof是模糊的最好的,虽然我有一个公关etty公司把握OOP的概念。我如何解决这些错误并达到预期效果?

回答

5

在Java中,泛型是不变的。这意味着Class<FirstSpecificClass>不是Class<AbstractClass>,即使FirstSpecificClassAbstractClass

您可以通过显式允许具有上界通配符的子类型来解决此问题。在需要的AbstractClass类型参数之前加上? extends

private Class<? extends AbstractClass> classType; 

private Types(Class<? extends AbstractClass> classType) { 
    this.classType = classType; 
} 

public Class<? extends AbstractClass> getClassType() { 
    return this.classType; 
} 

此外,您必须为instanceof操作的源代码直接指定的类型,所以这并不编译:

if(instance instanceof t.getClassType()) 

可以使用Class object's isInstance method相反,对于一个运行时的解决方案:

if(t.getClassType().isInstance(instance)) 
+0

aha!谢谢!这解决了构造函数中的类型不兼容问题。我仍然在'instanceof'检查中得到一个错误,因为右边的参数实际上不应该是一个Class对象(显然它需要是一个“类型”)。我如何在适当的情况下进行投票以实现检查实例? – 2014-12-05 20:07:15

+0

你解决了,因为我打字。谢谢! – 2014-12-05 20:07:47

+0

我也注意到这个错误,我更新了我的答案。 – rgettman 2014-12-05 20:08:12