我正在接触一个接口 - Codec,它是通用类型。
它有一个这样的方法,我需要实现
Class<T> getEncoderClass()
现在,如果实现是针对这样的简单类,那么实现很简单 -
public ACodec implements Codec<A>{
public Class<A> getEncoderClass(){
return A.class;
}
}
但是在通用实现的情况下,我很困惑如何编写例如 -
public class A<B>{
}
public ACodec implements Codec<A>{
public Class<A<B>> getEncoderClass(){
//How to implement this ?
}
}
答案 0 :(得分:1)
您需要更改定义ACodec
类的方式,如下所示:
class ACodec<T> implements Codec<A<T>>{
public Class<A<T>> getEncoderClass(){
//How to implement this ?
}
}
此处,班级T
中的类型参数 ACodec
和班级B
中的A
应替换为相同的类型而我相信这就是你想要达到的目标。示例:
ACodec<String> aCodecStr = new ACodec<String>();
Class<A<String>> codecStr = aCodecStr.getEncoderClass();//works
Class<A<Integer>> codecInteger = aCodecStr.getEncoderClass();//doesn't work
也就是说,实际上不可能在Class
中得到A<T>
所代表的getEncoderClass
,因为 Generics 在编译时会经历类型擦除。
答案 1 :(得分:-2)
在Java中,在编译代码(类型擦除)后,通用信息会丢失,因此每个泛型类也是非泛型类。
因此,您的第一个示例中的代码也可以正常工作。