Java 类型T的方法未定义
我正在尝试这个例子,但不能使它工作;它抛出Java 类型T的方法未定义,java,generics,undefined,undefined-function,Java,Generics,Undefined,Undefined Function,我正在尝试这个例子,但不能使它工作;它抛出类型T的getFromInt(int)方法未定义 T是一种通用枚举类型 public static <T> T deserializeEnumeration(InputStream inputStream) { int asInt = deserializeInt(inputStream); T deserializeObject = T.getFromInt(asInt); return de
类型T的getFromInt(int)方法未定义
T
是一种通用枚举类型
public static <T> T deserializeEnumeration(InputStream inputStream) {
int asInt = deserializeInt(inputStream);
T deserializeObject = T.getFromInt(asInt);
return deserializeObject;
}
publicstatict反序列化枚举(InputStream-InputStream){
int asInt=反序列化int(inputStream);
T反序列化对象=T.getFromInt(asInt);
返回反序列化对象;
}
我调用前面的方法,例如:
objectToDeserialize.setUnit(InputStreamUtil.<Unit>deserializeEnumeration(inputStream));
objectToDeserialize.setUnit(InputStreamUtil.deserializeEnumeration(inputStream));
或
objectToDeserialize.setShuntCompensatorType(InputStreamUtil.deserializeEnumeration(inputStream));
或者等等。你可以自己解决这个问题。正如您在评论中所述:
我有一些枚举都有getFromInt方法
对该方法稍加修改,通过添加一个新参数,即枚举的类型,您可以使用调用所述的getFromInt
方法:
public static <T> T deserializeEnumeration(Class<? extends T> type, InputStream inputStream){
try {
int asInt = deserializeInt(inputStream);
// int.class indicates the parameter
Method method = type.getDeclaredMethod("getAsInt", int.class);
// null means no instance as it is a static method
return method.invoke(null, asInt);
} catch(NoSuchMethodException, InvocationTargetException, IllegalAccessException e){
throw new IllegalStateException(e);
}
}
public static T反序列化枚举(Class既然您只是将int
转换为一个新类型T
,为什么不尝试传入一个lambda
来进行如下转换:
public class FunctionInterface {
public static void main(String... args) {
getT(1, String::valueOf);
}
private static <T> T getT(int i, Function<Integer, T> converter) {
return converter.apply(i); // passing in the function;
}
}
公共类函数接口{
公共静态void main(字符串…参数){
getT(1,String::valueOf);
}
私有静态T getT(int i,函数转换器){
返回converter.apply(i);//传入函数;
}
}
您尚未指定t
具有方法getFromInt(int)
您正试图从泛型参数调用静态
方法-这将不起作用
像这样的方法应该会奏效:
interface FromInt {
FromInt getFromInt(int i);
}
enum MyEnum implements FromInt {
Hello,
Bye;
@Override
public FromInt getFromInt(int i) {
return MyEnum.values()[i];
}
}
public static <T extends Enum<T> & FromInt> T deserializeEnumeration(Class<T> clazz, InputStream inputStream) {
int asInt = 1;
// Use the first element of the `enum` to do the lookup.
FromInt fromInt = clazz.getEnumConstants()[0].getFromInt(asInt);
return (T)fromInt;
}
接口FromInt{
FromInt getFromInt(inti);
}
枚举MyEnum实现FromInt{
你好
再见;
@凌驾
公共FromInt getFromInt(int i){
返回MyEnum.values()[i];
}
}
公共静态T反序列化枚举(类clazz,InputStream InputStream){
int-asInt=1;
//使用'enum'的第一个元素进行查找。
FromInt FromInt=clazz.getEnumConstants()[0].getFromInt(asInt);
从int返回(T);
}
什么应该是T
呢?你到底想做什么?你的代码中的T是java.lang.Object的扩展,getFromInt不是为Objective定义的。我不认为这对于枚举来说是泛型的。枚举是一种不能扩展的类型,所以它总是相同的类型。公共静态MyEnum deserializeEnumeration(InputStream InputStream)
现在,如果希望返回多个枚举,则需要将类型作为参数传递public static T deserializeEnumeration(InputStream InputStream,类类型)
但是再次强调,T
只是一个对象,因此该方法不存在。您需要一个声明getFromInt
的公共类型,但我不相信enum
可以实现接口,它不能扩展sur的类…@AxelHenum
s可以实现接口,就像旁注一样,如果getFromInt
始终执行索引查找,然后甚至可以使用clazz.getEnumConstans()[asInt]
,并且可以将方法getFromInt
抛出到调用deserializeEnumeration
的trashI am中,例如objectToDeserialize.setUnit(InputStreamUtil.deserializeEnumeration(inputStream));
如何修改它以适应您的代码?@SalemMasoud尝试objectToDeserialize.setUnit(InputStreamUtil.deserializeEnumeration(Unit.class,inputStream));
interface FromInt {
FromInt getFromInt(int i);
}
enum MyEnum implements FromInt {
Hello,
Bye;
@Override
public FromInt getFromInt(int i) {
return MyEnum.values()[i];
}
}
public static <T extends Enum<T> & FromInt> T deserializeEnumeration(Class<T> clazz, InputStream inputStream) {
int asInt = 1;
// Use the first element of the `enum` to do the lookup.
FromInt fromInt = clazz.getEnumConstants()[0].getFromInt(asInt);
return (T)fromInt;
}