-5

它关于编译这个方法,其中 T 是通用的。有没有办法用 javac 编译器(Java 1.8)编译它而不会出现任何错误?

public class MyGenericClass<T>{
    public void someGenericAction(T value){
        int key = (int) value;
    }
}

来自德国的问候!

4

3 回答 3

2

我当然希望这在 Java 中是不可能的。无法保证任何任意类型都可以“直接”并安全地类型转换为 a int,这正是您的方法所需要的。事实上,对于绝大多数类型来说,情况并非如此。

(int)"abc"甚至是什么意思,例如?(这在您提供的方法中在技术上是可能的,因为这"abc"是对您的方法的完全有效的输入)。这种演员阵容显然是胡说八道,Java 不应该允许这样做。你可以想出很多这样的案例,而这种演员阵容显然是胡说八道。

在技​​术上确实有效的情况下,它也可能导致细微的错误。例如,(int)11.2将导致舍入(它等于11),因此会导致数据丢失。

TL;DR不,这是不可能的,你也不希望它成为可能,因为你正在尝试做一些根本没有意义的事情。

于 2017-07-14T11:56:18.047 回答
0

您本质上是在要求一个肮脏的黑客攻击:一般来说,任何类型如何被强制转换为int?

让我们希望T有一个合理的toString方法,并利用它:

int key = Integer.parseInt(value.toString());

这至少会编译,因为 Java 中的所有对象都有一个toString()方法。但您的工作是处理可能在运行时抛出的无数异常。您可以为其他原始类型和特定类型的函数添加重载,在这些类型T中您可以做一些比使用该toString()方法更明智的事情。

于 2017-07-14T11:34:10.587 回答
0

你可以这样做

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);
        }
}
于 2017-07-14T11:57:05.103 回答