日期:2014-05-20  浏览次数:20744 次

请帮我看看下面这个泛型类的程序错在哪,谢谢
class   a <F,G>
{
void   make(F   x,G   y){
x.put1();
y.put1();
}
}
class   b
{
public   void   put1(){
System.out.println( "我是B类 ");
}
}

class   c
{
public   void   put1(){
System.out.println( "我是C类 ");
}
}

class   ex519
{
public   static   void   main(String   args[])
{
a <b,c>   mm=new   a <b,c> ();
b   xx=new   b();
c   yy=new   c();
mm.make(xx,yy);
}
}


------解决方案--------------------
你写的这些功能并不好体现泛型的设计的优势,反而让泛型变成了设计的绊脚石。
class a <F,G>
{
void make(F x,G y){
x.put1();
y.put1();
}
}
该成
class a <F,G>
{
void make(F x,G y){
((b)x).put1();
((c)y).put1();
}
}但是你觉得这样的话,用泛型就无任何意义,直接传b,c要好得多。
至于泛型的意义,你可以参考集合类的实现代码。
------解决方案--------------------
interface SomeInterface
{
public void put1();
}

class A <F extends SomeInterface, G extends SomeInterface>
{
void make(F x,G y)
{
x.put1();
y.put1();
}
}

class B implements SomeInterface
{
public void put1()
{
System.out.println( "我是B类 ");
}
}

class C implements SomeInterface
{
public void put1()
{
System.out.println( "我是B类 ");
}
}

public class ex519
{

public static void main(String[] args)
{
A <B, C> mm=new A <B, C> ();
B xx=new B();
C yy=new C();
mm.make(xx,yy);
}

}
把公共部分接口化。
------解决方案--------------------
经过我的改动 可以正确运行:

interface Put1 {
void put1();
}

class A <F extends Put1, G extends Put1> {
void make(F x, G y) {
x.put1();
y.put1();
}
}

class B implements Put1{
public void put1() {
System.out.println( "我是B类 ");
}
}

class C implements Put1{
public void put1() {
System.out.println( "我是C类 ");
}
}

public class ex519 {
public static void main(String args[]) {
A <B, C> mm = new A <B, C> ();
B xx = new B();
C yy = new C();
mm.make(xx, yy);
}
}