2010-06-28 23 views
3

为什么Java不允许以下通用返回类型:泛型不适合返回类型工作

public <T extends Enum<T> & MyInterface> Class<T> getEnum() { 
    return MyEnum.class; 
} 

虽然以下不工作:

public <T extends Enum<T> & MyInterface> Class<T> getEnum(Class<T> t) { 
    return t; 
} 

getEnum(MyEnum.class); 

MyEnum是enumaration实现界面MyInterface

为什么我不允许返回MyEnum.class

编辑:

我需要这个,因为功能getEnum()是一个接口。它可以被定义如下:

@Override 
public Class<MyEnum> getEnum() { 
    return MyEnum.class; 
} 

那么是什么然后将接口方法的返回类型为允许类,既是一个枚举,并实现MyInterface的任何Class对象?

回答

7

你的方法是通过T参数 - 的想法是,主叫得到指定什么T是 - 不是方法的实现。

由于T被隐式指定(由调用者)为MyEnum,因此对第二种方法的调用将起作用。

+0

嗯,是的,这是有道理的,我该怎么去说我希望函数返回一个对象的'Class',它既是枚举又是枚举并实现了'MyInterface'。 (我会更新我的问题,以反映我为什么要这样做) – Thirler 2010-06-28 09:19:47

2

我已经找到了答案,我的第二个问题太:

需要进行参数设置与一般类型的接口:

public interface MyEnumReturner <T extends Enum<T> & MyInterface> 
{ 
    public Class<T> getEnum(Class<T> t); 
} 

然后实现该接口的类定义要使用哪种类型:

public class MyClass implments MyEnumReturner<MyEnum> 
{ 
    @Override 
    public Class<MyEnum> getEnum() { 
     return MyEnum.class; 
    } 

}