0

ジェネリック初心者です。これが私のクラスです。

public interface Animal {    
    void eat();
}

public class Dog implements Animal {    
   public void eat() {   
      System.out.println("Dog eats biscuits");    
   }    
}

public class Cat implements Animal {    
   public void eat() {    
      System.out.println("Cat drinks milk");    
   }    
}

今、これらのクラスを一般的な方法で使用したいと考えています。

public class GenericExample {

   public <T extends Animal> T method1() {    
      //I want to return anything that extends Animal from this method
      //using generics, how can I do that    
   }

   public <T extends Animal> T method2(T animal) {    
      //I want to return anything that extends Animal from this method
      //using generics, how can I do that
   }

   public static void main(String[] args) {    
      Dog dog = method1(); //Returns a Dog    
      Cat cat = method2(new Cat()); //Returns a Cat    
   }    
}

メソッド「method1」と「method2」からジェネリック型 (Cat または Dog の可能性があります) を返すにはどうすればよいですか。「T extends Animal」を返すようなメソッドがいくつかあるので、ジェネリック型をメソッド レベルまたはクラス レベルで宣言する方がよいでしょうか。

4

2 に答える 2

1

ジェネリック型を返すメソッドを持つことはできず、キャストなしでメソッドの呼び出し元でその型にアクセスできると期待することはできません。ただし、その型がメソッドの引数から推測できる場合を除きます。したがって、あなたの例は機能しmainません。

したがって、ジェネリックなしで行くか、戻り値の型を手動でキャストします

public Animal method1()
    Dog dog = (Dog)method1()

または、メソッドが最初にサブクラスの型を返すようにします。

public Dog method1()
    Dog dog = method1()

または、ジェネリックを使用して、メソッドを呼び出すときに型を指定することもできます

public <T extends Animal> T method1()
    Dog dog = <Dog>method1()

または、型を推測できる引数を渡します (2 番目のメソッドは既にこれを満たしています)。

public <T extends Animal> T method1(Class<T> classOfreturnedType)
    Dog dog = method1(Dog.class)

method1また、それ自体であるstatic main場合にのみ呼び出すことができる nituce static.

于 2012-07-12T06:14:25.313 に答える
0

method1 は、アニマルを返すと単純に言っています。Animal の任意のインスタンスを返すと、コードがコンパイルされます。

return new Dog();

2 番目のメソッドは、引数として指定された動物と同じタイプの動物を返すことを示しています。したがって、引数自体を返すことができ、コンパイルされます。メソッドが返さなければならない型は言いましたが、メソッドが何をして返さなければならないかは言っていないので、実装することは不可能です。私が言えることは、それreturn animal;がコンパイルされるということだけです。

于 2012-07-12T05:58:20.663 に答える