java通用方法基础

java通用方法基础,java,generics,methods,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)

为了更好地理解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    }
1公共类SomeClass{
2.
3o小体;
4.
5公共类(){
6 someFunc(新编号(1));
7        }
8.
9公共函数(O参数){
10//代码
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    }
1公共类SomeClass{
2.
3o小体;
4.
5公共类(){
6 someFunc(新编号(1));
7        }
8.
9公共函数(O参数){
10//代码
11        }
12    }
但这给3号线带来了一个新问题

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


谢谢你的时间

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

例如
newsomeclass()

现在,编译器将有一个构造函数,该构造函数尝试将数字传递给一个需要O的方法,在本例中是一个HashMap

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

public SomeClass(O something) {
  someFunc(something);
}
如果您知道要创建并传递一个数字,您的泛型应该改为

class SomeClass<O extends Number>
class-SomeClass

问题在于,使用
时,您声明O可以是扩展对象的任何类型(因此实际上是任何类型-您可以将其更改为

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

eclipse建议的解决方案中没有一个是好的:

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

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

public void someFunc(Number n) {
    // code
}

O可以是任何东西(字符串、Foo、套接字、任何你能想象到的对象)。因此,以数字作为参数调用该方法是没有意义的。在更高的层次上,你想实现什么?@JB Nizet等人。我相信我理解你所说的大部分内容。这就是我不清楚的地方。如果我像这样实例化我的类:SomeClass cls=new SomeClass,那么我就能够调用cls.someFunc(new Number(1));。然而,我不能从类本身发出相同的调用。为什么会这样?@user1056027:因为如果您将O实例化为Object类型,则从Number->Object进行转换是有效的。但是,在构造函数中,您的代码必须应用于所有可能的O实例化(对象、数字、HashMap、Long等),其中一些是错误的。