簡體   English   中英

通用方法適用於不同的實際參數

[英]Generic method works with different actual parameter

這里我有一個接受泛型類型參數T的泛型方法

 public static <T> boolean compare(T p1, T p2) {
        return p1.equals(p2);
    }

現在,如果我像下面這樣調用這個方法

compare(10, "");

它工作,但我認為它不應該工作,因為它只能接受一種類型的Type parameter ,那么推理算法如何在這里工作?

它的工作原理是因為Integer和String有共同的父對象,你沒有在類型T中指定任何約束。如果你寫:

public static <T extends Number> boolean compare(T p1, T p2) {
    return p1.equals(p2);
}

你得到編譯時錯誤。

方法調用有效,因為您沒有約束類型T ,因為StringInteger都是java.lang.Object子類型,它們是將被推斷的類型。

您的方法將編譯,而不是在運行時拋出任何異常。

原因是:

  • 類型擦除將阻止JVM在運行時知道您的參數化類型,並且因為您沒有綁定參數化類型(例如T extends CharSequence等),所以任何Object和“boxable”原語將在調用期間編譯為參數
  • 在這種情況下,對參數調用equals等於調用Object#equals ,因此不會拋出運行時異常。 false將返回,因為參數之間的引用不相等

如果使用共享相同引用的對象調用方法,則它將打印為true

如果使用共享相同值的對象調用方法(例如兩個相等的String ),它將返回true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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