如何在Java中编写一个采用两个相同类型参数的通用方法?

当我发现以下代码在没有警告和打印的情况下进行编译时,我感到非常惊讶Integer / String

public final class GenericsTest {

private static <T> void method(T arg1, T arg2) {

System.out.println(arg1.getClass().getSimpleName());

System.out.println(arg2.getClass().getSimpleName());

}

public static void main(String[] args) {

method(1, "1");

}

}

我预期会有编译错误。

编译该代码是否有原因?

确保参数具有相同类型的正确方法是什么?

关于有限类型参数呢?我能想到的最好的是:

private static <T, U extends T> void method(T arg1, U arg2) {

System.out.println(arg1.getClass().getSimpleName());

System.out.println(arg2.getClass().getSimpleName());

}

不幸的是,java不允许循环约束。<T extends U, U extends T>不编译。这是死胡同吗?

回答:

究其原因,这是编译因为Java会推断出参数的最具体的超传入,在这种情况下,后是盒装,以和为传递。 ObjectSerializable &

Comparable<? extends Serializable & Comparable<? extends

Comparable<?>>>``1``Integer``"1"``String

没有泛型:

private static void method(Number arg1, Number arg2) {

即使没有泛型,也可以传入IntegerDouble

只有所涉及的类型是final,您才能在没有泛型的情况下执行此操作:

private static void method(String arg1, String arg2) {

// Yes, they're both Strings, guaranteed.

我可以考虑使用泛型的一种极端情况,以确保它们是准确的类型。如果您有一个final班级,并且设置了一个上限,则可以将其限制为同一班级。

public <T extends MyFinalClass> void method(T arg1, T arg2) {

// Yes, they're both MyFinalClasses

}

但是,如果没有泛型,您可以做同样的事情。

public void method(MyFinalClass arg1, MyFinalClass arg2) {

// Yes, they're both MyFinalClasses

}

以上是 如何在Java中编写一个采用两个相同类型参数的通用方法? 的全部内容, 来源链接: utcz.com/qa/424875.html

回到顶部