我正在运行一些测试以更好地理解java泛型方法,并遇到了以下问题。我有以下简单的课程:
1 public class SomeClass<O extends Object> {
2
3 O someVar;
4
5 public SomeClass() {
6 someFunc(new Number(1));
7 }
8
9 public void someFunc(O arg) {
10 // code
11 }
12 }
目前,编译器不喜欢第6行.eclipse建议将Number实例强制转换为O,或者将参数类型更改为第9行的Number。我真的希望尽可能避免这两种情况。 我知道像这样修改类会解决这个问题:
1 public class SomeClass {
2
3 O someVar;
4
5 public SomeClass() {
6 someFunc(new Number(1));
7 }
8
9 public <O extends Object> void someFunc(O arg) {
10 // code
11 }
12 }
但这会给第3行带来新问题。
那么我的原始代码可以做些什么呢?
谢谢你的时间!!!答案 0 :(得分:1)
第一个示例中的问题是您正在创建一个类SomeClass,其中O可以是扩展Object(或Object)的任何内容。
例如new SomeClass<HashMap>();
现在,编译器将有一个构造函数尝试将Number传递给一个方法,该方法需要 O ,在这种情况下为 HashMap 。
更改构造函数以获取传递给O something
的参数someFunc
。
public SomeClass(O something) {
someFunc(something);
}
如果您知道要创建并传递数字,那么您的通用应该代替
class SomeClass<O extends Number>
答案 1 :(得分:0)
问题在于,<O extends Object>
声明O可以是任何扩展Object的类型(所以实际上是任何类型 - 你可以将其更改为<O>
)。
然后声明函数someFunc
接受O
类型的参数,但随后传递一个数字。无法保证Number为O.
eclipse建议的解决方案都没有好处:
如果你将Number转换为O,你可能会收到错误,因为Number不是O(记住O可以是任何东西) 如果你将参数更改为Number,那么你可以传递私有变量,我认为这就是你想要的。
答案 2 :(得分:0)
您可以添加一个接受Number
作为参数的重载方法。
public void someFunc(Number n) {
// code
}