英文:
How to specify the generic type when calling a static method?
问题
我有以下的示例:
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");
}
}
这会失败并显示错误:
<!-- language: none -->
main3.java:15: 错误: 找不到适用的构造函数以 IntegerValue(T) 实例化
static <T> IntegerValue integer (T value) { return new IntegerValue(value); }
^
构造函数 IntegerValue.IntegerValue(Integer) 不适用
(参数不匹配; 无法将 T 转换为 Integer)
构造函数 IntegerValue.IntegerValue(String) 不适用
(参数不匹配; 无法将 T 转换为 String)
其中 T 是类型变量:
T extends Object,已在方法 <T>integer(T) 中声明
1 错误
如何在调用泛型 integer
方法时指定正确的 T
类型?
我还尝试了这个:
IntegerValue c = main3.<Integer>integer (42);
IntegerValue d = main3.<String>integer ("42");
但这没有帮助。
英文:
I have the following example:
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");
}
}
This fails with the error:
<!-- language: none -->
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
How to specify the right type of T
when calling the generic integer
method?
I tried also this:
IntegerValue c = main3.<Integer>integer (42);
IntegerValue d = main3.<String>integer ("42");
But it does not help.
答案1
得分: 4
只有2个IntegerValue
的构造函数可用:IntegerValue(Integer)
和IntegerValue(String)
。
因此,你想要的是__不可能的__。理论上你可以编写:
static <T extends Integer> IntegerValue integer(T value) { ... }
但创建一个下界为final类的类型变量显然是毫无用处的。
我猜想你想要的是有一个单一的方法,可以将Integer或String传递给这个方法。
这不是泛型的用途,而且泛型无法实现这一点。
你能够做到的最接近的是:
static IntegerValue integer(String value) { return new IntegerValue(value); }
static IntegerValue integer(Integer value) { return new IntegerValue(value); }
英文:
There are only 2 constructors available for IntegerValue
: IntegerValue(Integer)
and IntegerValue(String)
.
Therfore, what you want is not possible. Well, in theory you can write:
static <T extends Integer> IntegerValue integer(T value) { ... }
but creating a typevar whose lower bound is a final class is obviously quite completely useless.
I surmise that what you want is that you have a single method, and that you can pass either an Integer or a String into this method.
That's not what generics are for, and that is not possible with generics.
The closest you can get is:
static IntegerValue integer(String value) { return new IntegerValue(value); }
static IntegerValue integer(Integer value) { return new IntegerValue(value); }
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论