Java:通用方法或泛型类

时间:2017-11-21 19:22:07

标签: java generics

我看过这个签名探索库实现:

public final class QueryResults<T> {
    public static <T> QueryResults<T> emptyResults() {
        return (QueryResults<T>) EMPTY;
    };
}

我不太清楚:

  1. T已经声明为类定义时,为什么T再次声明为函数签名?
  2. 为什么方法会返回<T>而不是T

2 个答案:

答案 0 :(得分:3)

由于Type Erasure,泛型仅在编译时应用于类的实例 func boldSearchResult(searchString: String, resultString: String) -> NSMutableAttributedString { let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: resultString) let pattern = NSRegularExpression.escapedPattern(for: searchString.lowercased()) let range: NSRange = NSMakeRange(0, resultString.count) let regex = try! NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options()) regex.enumerateMatches(in: resultString.lowercased(), options: NSRegularExpression.MatchingOptions(), range: range) { (textCheckingResult, matchingFlags, stop) -> Void in let subRange = textCheckingResult?.range attributedString.addAttribute(NSAttributedStringKey.font, value: UIFont.boldSystemFont(ofSize: 15.0), range: subRange!) } return attributedString } 无效作为静态标识符。

因此,要创建使用类型参数的静态方法,必须在方法上声明type参数,从而创建泛型方法。

QueryResults<...>是type参数的声明,而不是返回类型(返回类型为<T>)。

答案 1 :(得分:0)

这些T具有不同的范围。类声明中的一个扩展了类的实例。静态方法中的那个只扩展到方法签名和正文。 您可以为这些类型变量使用不同的名称以避免混淆。

关于问题的第二部分:该方法不返回<T>。它返回QueryResults<T>。前者是类型变量<T>的声明。