我有以下示例:
public class main3
{
static class Value<T>
{
T value;
Value (T value) { this.value = value; }
}
static class IntegerValue extends Value<Integer>
{
IntegerValue (Integer value) { super (value); }
IntegerValue (String value) { super (Integer.valueOf (value)); }
}
static <T> IntegerValue integer (T value) { return new IntegerValue(value); }
public static void main (String ...argv)
{
IntegerValue a = new IntegerValue (42);
IntegerValue b = new IntegerValue ("42");
IntegerValue c = integer (42);
IntegerValue d = integer ("42");
}
}
此操作失败并出现错误:
main3.java:15: error: no suitable constructor found for IntegerValue(T)
static <T> IntegerValue integer (T value) { return new IntegerValue(value); }
^
constructor IntegerValue.IntegerValue(Integer) is not applicable
(argument mismatch; T cannot be converted to Integer)
constructor IntegerValue.IntegerValue(String) is not applicable
(argument mismatch; T cannot be converted to String)
where T is a type-variable:
T extends Object declared in method <T>integer(T)
1 error
如何指定 T
的正确类型当调用通用 integer
时方法?
我也尝试过这个:
IntegerValue c = main3.<Integer>integer (42);
IntegerValue d = main3.<String>integer ("42");
但这并没有帮助。
最佳答案
只有 2 个可用于 IntegerValue
的构造函数:IntegerValue(Integer)
和 IntegerValue(String)
。
因此,您想要的东西不可能。好吧,理论上你可以写:
static <T extends Integer> IntegerValue integer(T value) { ... }
但是创建一个下界是最终类的类型变量显然是完全没有用的。
我推测您想要的是有一个方法,并且可以将整数或字符串传递到此方法中。
这不是泛型的用途,泛型也是不可能的。
您可以获得的最接近的是:
static IntegerValue integer(String value) { return new IntegerValue(value); }
static IntegerValue integer(Integer value) { return new IntegerValue(value); }
关于java - 调用静态方法时如何指定泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63742443/