我有一个abstract class Processor<T,V>
和两个扩展它的类:
SimpleProcessor<T> extends Processor<T,T>
和
Converter<T,V> extends Processor<T,V>
问题是我需要能够创建一个包含各种对象的列表,这就是为什么拥有相同的超类,但我还需要能够区分它们。
我的问题是我需要能够强制类型参数始终是不同的类型(T是数字V是String =&gt;正确,但如果两者都是String,那么编译器将不接受它) 。有没有办法在Java中完成?
感谢。
答案 0 :(得分:1)
Afaik你不能以一般的方式做到这一点。但你可以使用不同的超类型:
Converter<T extends SuperTypeA, V extends SuperTypeB> extends Processor<T, V>
我想这不是你想要的。下一个解决方案是针对类型的运行时测试,如果类型不符合您的要求,则抛出IllegalArgumentException
:
public Converter(T t, V v) {
if (t.getClass() == v.getClass()) {
throw new IllegalArgumentException();
}
}
答案 1 :(得分:0)
在编译时无法确保这一点。
在运行时,您有2个选项。一种是传递实际对象并比较具体类(这里已有答案)。另一个需要使用反射。
假设有人将类声明为:
class MyConverter<T,V> extends Converter<T,V>
如果有人然后实例化这样的对象:
MyConverter<Number, String> m = new MyConverter<Number, String>();
或
Converter<Number, String> m = new Converter<Number, String>();
编写一个能够确定转换器实际类型的函数是不可能的。 但是,如果声明了这样的类:
class MyConverter extends Converter<Number, String>
可以通过反射确定它是一个Number to String转换器。