[英]how do I make a generic method lock its type in java?
我的意思是在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");
那樣調用方法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#,a-la QuickSort<int>(args)
而不是quickSort(args)
那樣“鎖定”java中的參數類型?
據我所知,我不能像
concatenate<String>("One", "Two")
那樣調用方法concatenate<String>("One", "Two")
因為這會給我一個錯誤
實際上,你可以,只有語法有點不同:
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(...)
失敗,出現以下錯誤:
Main類型的參數化方法quickSort(Integer ...)不適用於參數(Integer,String,Integer,Integer,String,Integer,Integer,Integer)
您可以使用泛型參數顯式,但語法與您嘗試的語法不同:
對於實例方法:
instance.<String>concatenate("a","b")
對於靜態方法:
MyClass.<String>concatenate("a","b")
你要問的是沒有“類型安全”。 Concatenate("one", 2)
是完全類型安全的。 從類型安全的角度來看,沒有理由不允許它。 泛型不是用於任意限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.