Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个类具有一些公共属性,但没有继承_Java - Fatal编程技术网

Java 两个类具有一些公共属性,但没有继承

Java 两个类具有一些公共属性,但没有继承,java,Java,我有两个类,它们有一些共同的属性: public class A { private String a; private String b; private String c; // setters & getters } public class B { private String a; private String b; private String c; // setters & getters } 如果没有hiretage,我想创建一个可以接受这两个类之一的泛型方法

我有两个类,它们有一些共同的属性:

public class A { 
private String a;
private String b;
private String c;
// setters & getters
}
public class B {
private String a;
private String b;
private String c;
// setters & getters
}
如果没有hiretage,我想创建一个可以接受这两个类之一的泛型方法

public <T> void myMethod(T object){
object.getC(); // "c" attribute of class A and B
}
public void myMethod(T对象){
类A和B的object.getC();/“c”属性
}

如何在java 8中做到这一点您可以定义如下接口:

interface ISomeInterfaceToGetC {
    String getC();
}
实施很简单:

class A implements ISomeInterfaceToGetC {
    @Override
    public String getC(){
        return c;
    }
}

然后,您的两个类都可以实现这个接口,而不是传递
T对象
,您可以传递
ISomeInterfaceToGetC实现对象
并调用
implementationObject.getC()将返回字符串。

您可以定义如下界面:

interface ISomeInterfaceToGetC {
    String getC();
}
实施很简单:

class A implements ISomeInterfaceToGetC {
    @Override
    public String getC(){
        return c;
    }
}

然后,您的两个类都可以实现这个接口,而不是传递
T对象
,您可以传递
ISomeInterfaceToGetC实现对象
并调用
implementationObject.getC()将返回您的字符串。

为什么不直接使用单独的POJO类,它将同时提供公共代码,而无需继承或实现

class Data{
    private String a;
    public String getA(){
        return this.a;
    }
    /* TO DO */
}

class A {
   private Data data;
    /* TO DO */
}

class B {
   private Data data;
    /* TO DO */
}

public void myMethod(Data data){
    data.getA();
}

为什么不直接使用单独的POJO类呢?它既可以提供公共代码,也不需要继承或实现

class Data{
    private String a;
    public String getA(){
        return this.a;
    }
    /* TO DO */
}

class A {
   private Data data;
    /* TO DO */
}

class B {
   private Data data;
    /* TO DO */
}

public void myMethod(Data data){
    data.getA();
}

我还建议您在这里使用和接口。然而,如果你真的想遵循你原来的方式。下面是一个例子

public <T> void myMethod(T object){
    String val;//Common type for both Class A and B

    if (object instanceof A)
        val = ((A) object).getC();
    else if (object instanceof B)
        val = ((B) object).getC();
    else
        val = null; //Unsupported type

    System.out.println(val);
}
public void myMethod(T对象){
String val;//A类和B类的通用类型
if(A的对象实例)
val=((A)object.getC();
else if(B的对象实例)
val=((B)object.getC();
其他的
val=null;//不支持的类型
系统输出打印项次(val);
}

我还建议您在此处使用和接口。然而,如果你真的想遵循你原来的方式。下面是一个例子

public <T> void myMethod(T object){
    String val;//Common type for both Class A and B

    if (object instanceof A)
        val = ((A) object).getC();
    else if (object instanceof B)
        val = ((B) object).getC();
    else
        val = null; //Unsupported type

    System.out.println(val);
}
public void myMethod(T对象){
String val;//A类和B类的通用类型
if(A的对象实例)
val=((A)object.getC();
else if(B的对象实例)
val=((B)object.getC();
其他的
val=null;//不支持的类型
系统输出打印项次(val);
}

如果您想要一种通用的方法来实现这一点,那么您可以按照以下步骤操作

a。首先定义一个接口

    public interface Sea {

       public int getC();
    }
b。然后类让您的两个类实现接口

public class Eh implements Sea {

    private int c = -1;

    @Override
    public int getC() {
        return c;
    }
}

public class Bee implements Sea {

    private int c = -1;

    @Override
    public int getC() {
        return c;
    }
}
c。现在,您可以使用带有参数的泛型方法,该参数接受从接口
Sea
实现的任何泛型对象

public class GenericClass<T extends Sea> {
    public void getGenericSea(T object) {
        object.getC();
    }
}
公共类GenericClass{
public void getGenericSea(T对象){
getC();
}
}

如果您想要一种通用的方法来实现这一点,那么您可以按照以下步骤操作

a。首先定义一个接口

    public interface Sea {

       public int getC();
    }
b。然后类让您的两个类实现接口

public class Eh implements Sea {

    private int c = -1;

    @Override
    public int getC() {
        return c;
    }
}

public class Bee implements Sea {

    private int c = -1;

    @Override
    public int getC() {
        return c;
    }
}
c。现在,您可以使用带有参数的泛型方法,该参数接受从接口
Sea
实现的任何泛型对象

public class GenericClass<T extends Sea> {
    public void getGenericSea(T object) {
        object.getC();
    }
}
公共类GenericClass{
public void getGenericSea(T对象){
getC();
}
}

您应该使用一个接口,并在其中定义getC()方法。然后可以将接口传递给该方法。为什么不希望继承?如果它们不是同一类型,或者假设它们不具有相同的超类型,这样做是没有意义的接口或继承可能是最好的方式,但如果您确实需要它们完全分开,您可以尝试提供能够从类中提取属性的函数参数(即
函数
)。然后您可以像
myMethod(instanceOfA,A::getC)
myMethod(instanceOfB,B::getC)
一样使用它。但我要重申:如果你能使用一个通用接口,那么就使用它吧@mzlle然后查找java接口。不要要求定制代码,仅仅通过复制粘贴实际上不会学到任何东西。学习使用它们将使您更容易理解它,并且能够在下次自己完成它,而不仅仅是复制粘贴其他人的代码。您应该使用一个接口并在其中定义getC()方法。然后可以将接口传递给该方法。为什么不希望继承?如果它们不是同一类型,或者假设它们不具有相同的超类型,这样做是没有意义的接口或继承可能是最好的方式,但如果您确实需要它们完全分开,您可以尝试提供能够从类中提取属性的函数参数(即
函数
)。然后您可以像
myMethod(instanceOfA,A::getC)
myMethod(instanceOfB,B::getC)
一样使用它。但我要重申:如果你能使用一个通用接口,那么就使用它吧@mzlle然后查找java接口。不要要求定制代码,仅仅通过复制粘贴实际上不会学到任何东西。与仅仅复制粘贴别人的代码相比,学会与他们一起工作将使你更容易理解它,并能在下次自己完成它好,谢谢你Breningood,谢谢你Brenin