簡體   English   中英

如何使通用方法在java中鎖定其類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM