【发布时间】:2015-05-29 04:46:49
【问题描述】:
好吧,乖点儿。
这是一个枚举,它使用返回“原始类型”的方法实现接口,这会在接口中的getCaste() 方法上给我一个警告。
public enum Thing implements HasCaste {
Type1 {
@Override
public Class getCaste() {
return String.class;
}
};
}
interface HasCaste {
public Class getCaste();
}
如果我将接口的方法更改为:
public <T> Class<T> getCaste();
它在Type1 的方法签名上更改为未经检查的警告。如果我然后将Type1.getCaste()的签名更改为:
public <T> Class<T> getCaste()
然后返回有一个不兼容的类型错误,因为Class<String> 无法转换为Class<T>。如果我将返回值更改为(Class<T>) String.class,我们会收到未经检查的强制转换警告。
有没有办法在没有警告的情况下做到这一点?
编辑:
很抱歉我之前没有添加这个,但这样做会很好:
, Type2 {
@Override
public Class getCaste() {
return Integer.class;
}
};
【问题讨论】:
-
对于您的编辑,您不能使用枚举。
-
@Radiodef 我实际上正计划链接那个问题:p(我是那个问题的提问者)
-
是的,不幸的是,从技术上讲,枚举实际上可以携带泛型类型,因此这只是目前语言规范的限制。 (@EpicPandaForce 嗨:))
-
声明
public <T> Class<T> getCaste()类型的方法是在告诉编译器方法的调用者 可以选择任何T并返回Class<T>。但是,这实际上并非如此,因此您会收到警告。