2016-12-14 25 views
-2

私はジェネリックスを学ぼうとしています。私は、主題に関する私の現在の理解を示す簡単な例から始めたいと思っていましたが、それはうまくいかず、理由もわかりません。私が受け取るエラーは、ジェネリックで作業しようとした他の多くの人たちと同じです:「型のメソッドは...引数には適用できません...」簡単なJavaジェネリックスの例

私はLesson: Generics (The Java Tutorials > Bonus)私は明らかに、この主題に関する重複した質問の多くによって回答されていない重要な概念を誤解しています(つまり、知識が不足しているため質問に答えられていません。付与される)。私の場合、私の例は、他の多くの「答え」と同じように見えますが、ここにはあります。私はこれを学ぶことを試みているので、ゆっくりと入力してください。

import java.util.concurrent.ConcurrentHashMap; 

public class TestMain { 

public static void main(String[] args) { makeTable(ThisType.CUSTOMER); } 

private enum ThisType { CUSTOMER, TRANSACTION } 

static <K, V> ConcurrentHashMap<K, V> makeTable(ThisType type) { 
    ConcurrentHashMap<K, V> thisTable = new ConcurrentHashMap<>(); 
    Integer key = 0; 
    String value = null; 

    switch (type) { 
    case CUSTOMER: 
     key = 0; 
     value = "nothing to report"; 
     break; 
    case TRANSACTION: 
     break; 
    default:    
     break; 

    } 

    while (key < 10) { 
     thisTable.put(key, value); 
     key++; 
    } 

    return thisTable; 
} 

} 

EDITEDは "int"を "Integer"に置き換えます。

+3

マップに入れる物は、 'K'と' V'型でなければなりません。コンパイラが保証しない 'int'と' String'を入れているのは、署名 ' 'と互換性があります。ジェネリック型はオブジェクトでなければならないことに注意してください。型引数に 'int'の代わりに' Integer'を使う必要があります。 – JonK

+0

コンパイラがメソッドを定義する方法は、メソッドの戻り値の代入から 'K'と' V'の型を推測しようとします。問題はコンパイル時にコンパイラがそのメソッドへのすべての呼び出しを考慮することができず(異なる型の複数のものがあるかもしれない)、 'K'と' V'が実際に何であるかを知ることができないことです。その場合、両方の型の値を作成する手段を提供することはあなた次第です。それらをパラメータとして渡したり、クラスを渡したり、インスタンスを構築したり、ファクトリなどを渡したりすることによって実現することができます。 – Thomas

+0

別の方法として、2つの言語( 'K'と' V')の辞書を作成するようにコンパイラに指示します。その2つの言語が英語とフランス語であることを定義することができます。しかし、この方法の中で、あなたが辞書/地図に入れたのはすべて中国語とスペイン語です。呼び出し元がそれらの2つを正確に望んでいるが、コンパイラは誤ったものを生成するために解凍されないようにその辞書を構築することを拒否するでしょう:) – Thomas

答えて

1

ConcurrentHashMapを定義して、タイプKのキーとタイプVの値を取りますが、タイプ 'int'のキーとタイプStringのキーを追加しようとしました。

+0

私のコードで行ったことを教えてもらったことがありますが、ジェネリック型はジェネリック型で表現できないことを説明するために何もしていません。ジェネリックの目的全体がで表すことができないため、後でをメソッドのどこかで使用することにしますか? – EricO

+1

@ EricO は、任意の2つのタイプを表すことができます。ただし、タイプがのマップを定義したため、メソッドのKキーとV値のみを受け入れることができます。ジェネリックでデータ型を定義し、それが定義されているのと同じメソッドで別の型を追加することはできません。 –

+0

本当に尋ねられる必要がある質問は次のとおりです。ConcurrentHashMap がConcurrentHashMap として返されるように、IntegerとStringを汎用的にするにはどうすればよいですか? – EricO