失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > JAVA判定参数类型进行赋值_java – 为什么泛型方法在赋值中更改了参数化类型?...

JAVA判定参数类型进行赋值_java – 为什么泛型方法在赋值中更改了参数化类型?...

时间:2024-03-29 16:58:43

相关推荐

JAVA判定参数类型进行赋值_java  – 为什么泛型方法在赋值中更改了参数化类型?...

在编写处理表单数据的通用方法时,我遇到了以下(我认为)未完成的行为.给出以下代码:

public class Test {

public void someGenericMethod(Integer a) {

@SuppressWarnings("unchecked")

T t = (T) a;

System.out.println(t);

System.out.println(t.getClass());

}

public static void main(String[] args) {

Test test = new Test();

test.someGenericMethod(42);

}

}

AFAIK,上面的代码应该在行T t =(T)a中生成一个ClassCastException,因为main中的方法调用是将参数化类型设置为BigDecimal,并且不允许从Integer转换为BigDecimal,相反,我所期望的程序执行得很好并打印以下内容:

42

class java.lang.Integer

实际上,如果我在方法签名中添加另一个参数(如String b)并再生成另一个赋值T t2 =(T)b,则程序打印

42

class java.lang.String

为什么t变量将它的类型改为Integer(在任何可能的情况下,对T类型的对象进行某种促销)?

对此行为的任何解释都是受欢迎的

解决方法:

(T)a是未经检查的强制转换:由于type erasure,运行时无法知道T是什么类型,因此它无法实际检查是否属于类型T.

执行此操作时,编译器会发出警告;在您的情况下,您通过编写@SuppressWarnings(“未选中”)来抑制该警告.

编辑添加(以回应下面评论中的进一步问题):

如果你想检查演员表,你可以这样写:

public class Test {

public void someGenericMethod(Class clazz, Integer a) {

T t = clazz.cast(a);

System.out.println(t);

System.out.println(t.getClass());

}

public static void main(String[] args) {

Test test = new Test();

// gives a ClassCastException at runtime:

test.someGenericMethod(BigDecimal.class, 42);

}

}

通过传递clazz,允许运行时检查强制转换;而且,更重要的是,您允许编译器从方法参数中推断出T,因此您不必再编写测试.< BigDecimal> someGenericMethod.

当然,调用该方法的代码仍然可以通过使用未经检查的强制转换来避免这种情况:

public static void main(String[] args) {

Test test = new Test();

Class clazz = Object.class;

test.someGenericMethod((Class) clazz, 42);

}

但那是主要的错,而不是某些GenericMethod.

标签:java,generics

来源: https://codeday.me/bug/0529/1181833.html

如果觉得《JAVA判定参数类型进行赋值_java – 为什么泛型方法在赋值中更改了参数化类型?...》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。