簡體   English   中英

構造函數調用中的類型參數的目的是什么?

[英]What is the purpose of type arguments in constructor call following new?

在Java規范( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9 )中,new具有以下形式:

ClassInstanceCreationExpression ::=
| new TypeArguments_opt TypeDeclSpecifier TypeArgumentsOrDiamond_opt
    ( ArgumentListopt ) ClassBodyopt
| Primary . new TypeArguments_opt Identifier TypeArgumentsOrDiamond_opt
    ( ArgumentListopt ) ClassBodyopt

新的后面的第一個可選類型參數列表的目的是什么? 我無法從我對15.9節的閱讀中找到它(對類型參數列表的所有引用似乎都引用了類型/標識符之后的列表)。 測試標准Java編譯器上的隨機位會產生令人困惑的結果:

public class Foo<T> { }
// ...
Foo<Integer> t1 = new <Integer> Foo<Integer>();  // works
Foo<Integer> t2 = new <Integer> Foo();           // works -- unchecked warning missing the type arg after Foo
Foo<Integer> t3 = new <Boolean> Foo<Integer>();  // works
Foo<Integer> t4 = new <Float, Boolean> Foo<Integer>();  // works
Foo<Integer> t5 = new <NotDefined> Foo<Integer>();  // fails -- NotDefined is undefined

在這些簡單的例子中,雖然它解析並檢查其參數的有效性,但似乎第一個參數列表沒有做任何有意義的事情。

構造函數也可以聲明類型參數

public class Main {     
    public static class Foo<T> {
        public <E> Foo(T object, E object2) {

        }
    }
    public static void main(String[] args) throws Exception {
        Foo<Integer> foo = new <String> Foo<Integer>(1, "hello");           
    }    
}

這就是構造函數調用之前的<String> 它是構造函數的類型參數。

下列

Foo<Integer> foo = new <String> Foo<Integer>(1, new Object());

失敗了

Main.Foo類型的參數化構造函數Foo(Integer,String)不適用於參數(Integer,Object)

在你的最后

Foo<Integer> t5 = new <NotDefined> Foo<Integer>();  // fails -- NotDefined is undefined

NotDefined不是編譯期間找到的類型。 如果是的話,它只會給你一個警告,它是unused

你可以為方法調用添加無用的類型參數,像

Math.<Runnable>max(1,2);

System.out.<Button>println();

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.1-200-E

非泛型方法可能適用於提供顯式類型參數的調用。 實際上,它可能會變得適用。 在這種情況下,類型參數將被忽略。

該規則源於兼容性和可替代性原則的問題。 由於接口或超類可以獨立於其子類型進行泛化,因此我們可以使用非泛型方法覆蓋泛型方法。 但是,重寫(非泛型)方法必須適用於對泛型方法的調用,包括顯式傳遞類型參數的調用。 否則,子類型不能替代其生成的超類型。

暫無
暫無

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

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