java - 如何使泛型方法在 Java 中锁定其类型?

标签 java generics types arguments locked

我的意思是,例如在 C# 中,我可以编写这样的通用方法:

public static void Concatenate<T> (T arg1, T arg2) 
{
    Console.WriteLine(arg1.ToString() + arg2.ToString());
}

然后如果我以这些不同的方式调用该方法:

Concatenate("one", "two"); // will work just fine, outputs "onetwo"
Concatenate(1, 2); // will also work great, outputs 12
Concatenate("one", 2) // will give a compiler error

或者我可以这样调用方法:Concatenate<string>("one", "two");并特别确保只有字符串进入...

现在如果我在 Java 中尝试完全相同的事情

public static <T> void concatenate(T arg1, T arg2) {
    System.out.println(arg1.toString() + arg2.toString());
}

并以与 C# 示例中完全相同的方式调用该方法:

concatenate("one", "two"); // will work just fine, outputs "onetwo"
concatenate(1, 2); // will also work great, outputs 12
concatenate("one", 2) // will work fine and outputs "one2"

据我所知我不能调用像concatenate<String>("One", "Two");这样的方法因为那会给我一个错误

有什么方法可以添加我在 C# 中发现的那种类型安全性?

所以我不会冒险将任何类型放入任一位置而只会收到警告...

更好的例子是使用可变参数

在 C# 中我会这样做:

public static void QuickSort<T>(params T[] args) // same as (T... args) in java
{
    // code
}

并且在调用它时我会确定只有一种参数通过例如做类似的事情得到:

QuickSort<int>(5, 9, 7, 3, 2, 5, 4, 1);

而在 java 中我可以这样做:

quickSort(5, "nine", 7, 3, "two", 5, 4, 1);

除了来自 IDE 的警告之外什么也得不到,而在 c# 中它会给出错误

所以我的问题是,有没有什么方法可以像在 C# 中那样在 Java 中“锁定”参数类型,a-la QuickSort<int>(args)而不是 quickSort(args)

最佳答案

as far as I know I can't call the method like concatenate<String>("One", "Two") as that will give me an error

其实也可以,只是语法有点不同:

public class Main {

    public static <T> void concatenate(T arg1, T arg2) {
        System.out.println(arg1.toString() + arg2.toString());
    }

    public static void main(String[] args) {
        Main.<String>concatenate("one", "two"); // will work just fine, outputs "onetwo"
        Main.<Integer>concatenate(1, 2); // will also work great, outputs 12
        Main.<String>concatenate("one", 2); // will fail at compile time
    }
}

如果concatenate()是非 static方法,语法为 obj.<String>concatenate(...) .

关于你的第二个例子:

public class Main {

    public static <T> void quickSort(T... args) {
    }

    public static void main(String[] args) {
        quickSort(5, "nine", 7, 3, "two", 5, 4, 1);                // warning
        Main.<Integer>quickSort(5, "nine", 7, 3, "two", 5, 4, 1);  // error
    }
}

在这里,Main.<Integer>quickSort(...)失败并出现以下错误:

The parameterized method quickSort(Integer...) of type Main is not applicable for the arguments (Integer, String, Integer, Integer, String, Integer, Integer, Integer)

关于java - 如何使泛型方法在 Java 中锁定其类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15189503/

相关文章:

java - 如何检查一个图像是否包含在另一个图像中?

java - "java.io.IOException: This may not be a PDF File"

generics - 接口(interface)的嵌套泛型类型

java - 将 CAS 与自定义登录页面一起使用

typescript - 接口(interface)泛型的类型推断

未强制执行 Java 接口(interface)

java - 在 JDK6 而不是 7 下编译的相互自引用类型参数?

haskell - 将有效的 forall 类型归因于 let-bound 变量时出现类型错误

scala - 在 Scala 中约束更高级的类型

java - @override 错误显示在 .xml 文件中