2

私はこのような基本クラスを与えられます:

 Class MyBase{

   public abstract <T> Student assign (T object);

 }

私はそれを以下のように拡張しています:

 Class MyClass extends MyBase{

   @Override
   public abstract <T> Student assign (T object){

     Student stew = new Student();
     ......

   }
 }

私の使用目的は次のとおりです。渡されたオブジェクトはTeacherタイプである必要があります。メソッド内で、Teacherの関数を呼び出すことによっていくつかの値を取得する新しいStudentを作成したいと思います。(たとえば、stew.setTeacherName = Teacher.getName();)次に、Studentを呼び出し元に返します。

質問:a)意図した動作を取得するにはどうすればよいですか?b)MyBaseを現在の方法で宣言することと、MyBaseを実行することの違いは何ですか?c)Baseクラスを変更でき、Baseクラスを変更できない場合の解決策を知りたい。

よろしくお願いします。また、有用なリソース/チュートリアルがあれば、それを指摘していただければ幸いです。再度、感謝します。

4

3 に答える 3

7

You cannot guarantee that the object being passed in to MyClass's assign method is a Teacher, if MyBase is defined this way. If you are allowed to modify MyBase, do the following:

abstract class MyBase
{
   public abstract <T extends Teacher> Student assign (T object);
}

and extend it with your class:

class MyClass extends MyBase
{
   @Override
   public <T extends Teacher> Student assign (T object){

     Student stew = new Student();
     ......

   }
}

This will guarantee that the object being passed in is a Teacher, even if it's really an instance of a subclass of Teacher.

EDIT: Another way to modify MyBase. Make the generic parameter part of the class definition instead of the method definition.

abstract class MyBase<T extends Teacher>
{
   public abstract Student assign (T object);
}

class MyClass<T extends Teacher> extends MyBase<T>
{
   @Override
   public  Student  assign (T object)
   {
      Student stew = new Student();
      ......
   }
}

// Could also do this...
class MyClass2 extends MyBase<Teacher>
{
   @Override
   public  Student  assign (Teacher object)
   {
      Student stew = new Student();
      ......
   }
 }

Here's Oracle's Java Generics Tutorial.

于 2013-02-19T23:13:35.810 に答える
1

ジェネリック メソッドは通常、具体的な型で動作するように特化できるジェネリック クラスとは対照的に、提供された任意の型で動作することを意図しています。これは、機能対オブジェクト指向のアプローチです。したがって、おそらく必要なのは、T パラメーターを持つジェネリック クラスを持つことです。

MyBase<T>

メソッドにそのパラメーターを使用させる

public abstract Student assign (T object)

教師を使用するように特化する

MyClass extends MyBase<Teacher>

とともに

public Student assign (Teacher object)

ほとんどの場合、私のジェネリック メソッドはまさにこの理由で静的です。インスタンス メソッドがパラメーター化されている場合、型パラメーターがメソッドではなくクラスに属しているのは論理的です。もちろん、普段も。

于 2013-02-19T23:12:49.213 に答える