java泛型方法基础

时间:2013-03-13 07:55:13

标签: java generics methods

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

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

谢谢你的时间!!!

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
}