强制两个参数化类型为不同的java

时间:2014-01-10 11:30:27

标签: java generics

我有一个abstract class Processor<T,V>和两个扩展它的类:

SimpleProcessor<T> extends Processor<T,T>

Converter<T,V> extends Processor<T,V>

问题是我需要能够创建一个包含各种对象的列表,这就是为什么拥有相同的超类,但我还需要能够区分它们。

我的问题是我需要能够强制类型参数始终是不同的类型(T是数字V是String =&gt;正确,但如果两者都是String,那么编译器将不接受它) 。有没有办法在Java中完成?

感谢。

2 个答案:

答案 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转换器。