0

我正在运行一些测试以更好地理解 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 行带来了一个新问题。

那么我的原始代码可以做什么呢?

感谢您的时间!!!

4

3 回答 3

1

第一个示例中的问题是您正在创建一个类 SomeClass ,其中 O 可以是任何扩展对象(或对象)的东西。

例如new SomeClass<HashMap>();

现在编译器将有一个构造函数,它试图将 Number 传递给一个需要O在这种情况下为HashMap的方法。

更改您的构造函数以获取O something您传递给的参数someFunc

public SomeClass(O something) {
  someFunc(something);
}

如果你知道你想创建和传递一个数字,你的泛型应该说

class SomeClass<O extends Number>
于 2013-03-13T08:02:50.317 回答
0

问题是<O extends Object>您声明 O 可以是扩展 Object 的任何类型(所以实际上是任何类型 - 您可以将其更改为<O>)。

然后你的函数someFunc被声明为接受一个类型的参数O,但是你传递了一个数字。不能保证 Number 为 O。

eclipse 建议的解决方案都不是好的:

如果您将 Number 转换为 O,您可能会收到错误,因为 Number 不是 O(记住 O 可以是任何东西)如果您将参数更改为 Number,那么您可以传递私有变量,我认为这就是您想要的。

于 2013-03-13T08:04:09.513 回答
0

您可以添加一个重载方法,该方法Number除外作为参数。

public void someFunc(Number n) {
    // code
}
于 2013-03-13T08:04:17.847 回答