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的类…@AxelH
    enum
    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;
    }