gpt4 book ai didi

具有泛型类型禁用方法的 java 类声明返回另一个泛型类型

转载 作者:行者123 更新时间:2023-11-30 09:14:18 25 4
gpt4 key购买 nike

我有这个小问题,我想知道这到底是怎么回事:我这样上课:

public class SomeSimpleClass {
//and I had method who returns generic. it can be instance of whatever, and for sure can be casted to U:
public <U>U giveMeSomething(String arg) {
return (U)SomewhereSomething.getValueCastingIsOK(arg);
}
}

然后我像这样使用它:

// give me some number:
Integer number = instanceSomeSimpleClass.giveMeSomething("I want integer value");

String text = instanceSomeSimpleClass.giveMeSomething("I want text now");

一切正常。来自 SomewhereSomething 的 getValueCastingIsOK 返回我想要的东西,我不需要在 giveMeSomething 上进行类型转换。看起来 U 被关联变量中的类型替换了..一切都很酷..

然后我创建了一个新类:

public class SomeOtherClass <T extends Something> {
//And I have the exactly same method here:
public <U>U giveMeSomething(String arg) {
return (U)SomewhereSomething.getValueCastingIsOK(arg);
}
}

现在,当我想以同样的方式使用它时,编译器(我使用的是 Java 1.7)告诉我,我必须使用类型转换,并开始像这样使用 giveMeSomething,因为 U 现在是对象,仅此而已...

Integer number = (Integer)instanceSomeSimpleClass.giveMeSomething("I want integer value");

:(

为什么在第二种情况下,编译器无法像第一种情况那样以相同的方式获取 U 类型。我必须做些什么才能做到这一点?

感谢您的回答、建议..;)

最佳答案

问题是您正在使用类 SomeOtherClass 的原始类型,但没有为您的声明提供任何类型参数:

SomeOtherClass instanceSomeSimpleClass = new SomeOtherClass();

当您这样做时,Java 编译器将用类型删除版本替换类中的所有泛型,甚至是不相关的泛型,例如您的泛型方法。方法的类型删除

public <U>U giveMeSomething(String arg) {

成为

public Object giveMeSomething(String arg) {

这需要转换为 Integer

您必须向 SomeOtherClass 提供一个类型参数(无用,除非您已经消除了使用 T 将类代码发布到此处的不必要代码):

SomeOtherClass<Something> instanceSomeSimpleClass = new SomeOtherClass<Something>();

或者您可以删除类定义中的类型参数,就像您原来的那样:

public class SomeSimpleClass {

两者都将保持通用方法不变,并消除转换 giveMeSomething 的返回类型的需要。

关于具有泛型类型禁用方法的 java 类声明返回另一个泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20573531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com