假设我有两个参数的泛型方法。
<T> void compare(T a, T b) {}结果是,可以传递任何类型的参数:T可能总是被解析为Object,因为任何其他类型都是Object。
是否有办法使接受参数的方法与任何类型完全相同?
发布于 2020-04-13 14:48:31
和在同一堂课上一样?不是的。如果A和B共享父类P,则始终能够将它们传递给期望使用P的泛型方法。
我看到限制它的唯一方法是添加这样的参数:
<T> void compare(T a, T b, Class<T> clazz) {}这是因为Java泛型是不变的,这意味着如果A extends B、G<A>和G<B>是完全不相交的类型(一种不扩展另一种)。例如,List<Person>和List<Student>是不兼容的类型,即使是Student extends Person。这不是直观的,只是语言的一个限制,其他一些语言,比如Scala,可以选择创建泛型类型:
不变量(类似于Java)
A extends B,则G<A> extends G<B>)
A extends B,则是G<B> extends G<A>))
发布于 2020-04-13 14:58:50
好的,让我们深入了解您的需求:
你有个方法
<T> void compare(T a, T b) {}并且您希望确保只使用相同的类型调用它。
好的,让我们使用两个对象:
Object a = new Object();
Object b = new Object();
compare(a, b);这里,我将两个对象传递给您的方法。当然,任何东西都是一个对象,因此,这个小小的更改也是有效的:
Object a = "Also an Object";
Object b = 42; // Boxing conversion
compare(a, b);如果你想接受任何类型,你也必须接受Object。任何东西都可以是一个对象。
因此,您的需求在编译时是不可能满足的。
但是运行时呢?
这实际上是可行的,而且非常容易:
<T> void compare(T a, T b) {
if (a.getClass() != b.getClass()) throw new IllegalArgumentException("not the same type");
}发布于 2020-04-13 14:59:32
据我所知,没有一种方法可以强制所有类型的参数都是相同类型的。
但是,您可以在调用该方法时指定类型参数,尽管这显然需要您知道在给定情况下使用的类型。
<Integer>compare(10, 22);https://stackoverflow.com/questions/61190372
复制相似问题