它关于编译这个方法,其中 T 是通用的。有没有办法用 javac 编译器(Java 1.8)编译它而不会出现任何错误?
public class MyGenericClass<T>{
public void someGenericAction(T value){
int key = (int) value;
}
}
来自德国的问候!
它关于编译这个方法,其中 T 是通用的。有没有办法用 javac 编译器(Java 1.8)编译它而不会出现任何错误?
public class MyGenericClass<T>{
public void someGenericAction(T value){
int key = (int) value;
}
}
来自德国的问候!
我当然希望这在 Java 中是不可能的。无法保证任何任意类型都可以“直接”并安全地类型转换为 a int
,这正是您的方法所需要的。事实上,对于绝大多数类型来说,情况并非如此。
(int)"abc"
甚至是什么意思,例如?(这在您提供的方法中在技术上是可能的,因为这"abc"
是对您的方法的完全有效的输入)。这种演员阵容显然是胡说八道,Java 不应该允许这样做。你可以想出很多这样的案例,而这种演员阵容显然是胡说八道。
在技术上确实有效的情况下,它也可能导致细微的错误。例如,(int)11.2
将导致舍入(它等于11
),因此会导致数据丢失。
TL;DR不,这是不可能的,你也不希望它成为可能,因为你正在尝试做一些根本没有意义的事情。
您本质上是在要求一个肮脏的黑客攻击:一般来说,任何类型如何被强制转换为int
?
让我们希望T
有一个合理的toString
方法,并利用它:
int key = Integer.parseInt(value.toString());
这至少会编译,因为 Java 中的所有对象都有一个toString()
方法。但您的工作是处理可能在运行时抛出的无数异常。您可以为其他原始类型和特定类型的函数添加重载,在这些类型T
中您可以做一些比使用该toString()
方法更明智的事情。
你可以这样做
class MyGenericClass<T>{
public static <T>void someGenericAction(T value){
int key = (Integer)value; // here is your's
System.out.println(key);
}
public static void main(String[] args){
someGenericAction(12);
}
}