Java 实例化泛型类型类的子类

Java 实例化泛型类型类的子类,java,generics,Java,Generics,我有一个简单的泛型类,如下所示: public class Test<T extends Number> { public void doSomething() { Test t = new Test(); t.getNumber(); } public T getNumber() { T d = new Double("1.5"); // I get an compiler error here!

我有一个简单的泛型类,如下所示:

public class Test<T extends Number> {

    public void doSomething() {
        Test t = new Test();
        t.getNumber();

    }

    public T getNumber() {
        T d = new Double("1.5"); // I get an compiler error here!
        return d;
    }
}
错误是:

Incompatible types:
[ERROR] found   : java.lang.Double
[ERROR] required: T

既然T扩展了这个数字,我本以为它会起作用。我遗漏了什么吗?

T扩展了数字,但这并不意味着它扩展了两倍。Double只是Number的已知子类之一。

T扩展Number,但这并不意味着它扩展Double。Double只是数字的已知子类之一。

在左边使用通用参数,在右边使用特定实现是不对的。

在左边使用通用参数,在右边使用特定实现是不对的

T d = (T)new Double("1.5");
你必须输入cast到T。即使它解决了你的问题,我还是对你所做的感到怀疑

你必须输入cast到T。即使它解决了你的问题,我还是对你所做的感到怀疑

在实例化测试时,应该会收到编译器警告。 假设您实例化了测试。然后getNumber方法中的行变为:

整数d=新的双精度1.5

显然,它应该抛出一个编译器错误

我认为您不应该使用泛型类型参数-将您的类替换为:

public class Test {
    public Number getNumber() {
        Number d = Double.valueOf("1.5"); // No compiler error
        return d;
    }
}
另一种解决方案是表示可以使用Double的任何超类作为类型参数的条件,即:

public class Test<T super Double> {
    public T getNumber() {
        T d = Double.valueOf("1.5"); // No compiler error
        return d;
    }
}
一些一般提示:

如果没有充分的理由,不要装箱基元类型。 不要使用new来实例化装箱基元类型,而是使用装箱类中的静态工厂方法。 没有充分的理由不要使用泛型类型。而且,当您遇到定义泛型类型的麻烦时,不要在没有类型参数的情况下实例化它。 在实例化测试时,应该会收到编译器警告。 假设您实例化了测试。然后getNumber方法中的行变为:

整数d=新的双精度1.5

显然,它应该抛出一个编译器错误

我认为您不应该使用泛型类型参数-将您的类替换为:

public class Test {
    public Number getNumber() {
        Number d = Double.valueOf("1.5"); // No compiler error
        return d;
    }
}
另一种解决方案是表示可以使用Double的任何超类作为类型参数的条件,即:

public class Test<T super Double> {
    public T getNumber() {
        T d = Double.valueOf("1.5"); // No compiler error
        return d;
    }
}
一些一般提示:

如果没有充分的理由,不要装箱基元类型。 不要使用new来实例化装箱基元类型,而是使用装箱类中的静态工厂方法。 没有充分的理由不要使用泛型类型。而且,当您遇到定义泛型类型的麻烦时,不要在没有类型参数的情况下实例化它。
泛型类型定义类测试意味着任何选择创建测试类对象的人都可以选择使用哪个类型参数。用户选择而不是您作为类实现者

这意味着您无法确定它将是哪种类型,因此您的getNumber方法只能安全地执行

返回一个以T对象形式出现的对象 返回空 返回其他方法返回的对象。
返回从类或类创建的对象泛型类型定义类测试意味着选择创建测试类对象的人可以选择使用哪个类型参数。用户选择而不是您作为类实现者

这意味着您无法确定它将是哪种类型,因此您的getNumber方法只能安全地执行

返回一个以T对象形式出现的对象 返回空 返回其他方法返回的对象。
返回一个从类或ClassI创建的对象,我明白你的意思。虽然,这有点令人困惑。谢谢我明白你的意思。虽然,这有点令人困惑。谢谢