[英]Java how to implement interface with a variadic method and generic return type
[英]Java Implement an interface type method in implement interface
有一個名為 Range 的接口,例如
public interface Range {
public Range newRange(int from,int to);
public boolean isIn(int value);
public int min();
public int max();
public Range add(Range r);
}
在implement接口中, Range newRange(1,5)
是設置1到5的范圍數,方法Range add(Range r.newRange(6,8))
將1到5的范圍加上6到8 基於方法Range newRange(1,5)
。 boolean isIn(int value)
如果值在此范圍內,則返回。 int min()
返回范圍內的最小值。 如何使用類作為引用類型來實現方法? 通過傳遞一個對象? 我的新newRange
是
public Range newRange(int from,int to){
RangeImplem impIns = new RangeImplem();
impIns.from = from;
impIns.to = to;
return impIns;
}
我對這個問題一無所知,並且對作為引用類型的類有點困惑。 謝謝。
我認為您的界面不正確。 你稱它為 Range,但它內部可以容納多個范圍。
因此,對於好的解決方案,將方法添加到 Range 以獲得多個范圍。
或者這里有一些解決方法:
import java.util.HashSet;
import java.util.Set;
public class RangeImpl implements Range {
private class SimpleRange {
public SimpleRange(int from, int to) {
this.from = from;
this.to = to;
}
final int from;
final int to;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SimpleRange that = (SimpleRange) o;
if (from != that.from) return false;
return to == that.to;
}
@Override
public int hashCode() {
int result = from;
result = 31 * result + to;
return result;
}
}
private Set<SimpleRange> ranges=new HashSet<>();
@Override
public Range add(int from, int to) {
ranges.add(new SimpleRange(from, to));
return this;
}
@Override
public int min() {
return 0;
}
@Override
public int max() {
return 0;
}
@Override
public Range add(Range r) {
//1) first way If there is only 1 your implementation of Range.
//extract ranges from inside
if (ranges instanceof RangeImpl) {
RangeImpl ri= (RangeImpl) r;
ranges.addAll(ri.ranges);
}
return this;
}
// way2:
@Override
public boolean isIn(int value) {
for (Range externalRange : externalRanges) {
externalRange.isIn()
}
for (SimpleRange range : ranges) {
range isin
}
return false;
}
@Override
Set<Range> externalRanges=new HashSet<>();
//cache supplied ranges and use them in ither methods
public Range add(Range r) {
externalRanges.add(r);
return this;
}
}
Here is your answer:
package com.genpact.java.interf;
public interface Range {
/**
* Create a new Range object representing an integer interval starting from 'from' and 'to', both limits inclusive
*/
public Range newRange(int from,int to);
/**
* Return if 'value' is in the range defined by this object
*/
public boolean isIn(int value);
/**
* Return the minimum value in range
*/
public int min();
/**
* Return the maximum value in range
*/
public int max();
/**
* Add range 'r' to this range, and return 'this'.
* 'r' and this may denote disjoint ranges, for instance:
* r.newRange(1,5).add(r.newRange(8,10)) denotes a range
* including 1,2,3,4,5,8,9,10
*/
public Range add(Range r);
}
package com.genpact.java.impl;
import com.genpact.java.interf.Range;
public class RangeImplem implements Range {
private int from;
private int to;
public RangeImplem() {
// TODO Auto-generated constructor stub
}
public RangeImplem(int from, int to) {
this.from = from;
this.to = to;
}
@Override
public Range newRange(int from, int to) {
Range range=new RangeImplem(from, to);
return range;
}
@Override
public boolean isIn(int value) {
//Return if 'value' is in the range defined by this object
if(value >= this.from && value <= this.to){
return true;
}
return false;
}
@Override
public int min() {
return this.from;
}
@Override
public int max() {
return this.to;
}
@Override
public Range add(Range r) {
this.from = r.min();
this.to = r.min();
return newRange(this.from,this.to);
}
public static void main(String[] args) {
RangeImplem r=new RangeImplem();
System.out.println(r.newRange(1,5).isIn(3)); //=> returns true
System.out.println(r.newRange(1,5).isIn(6)); //=> returns false
System.out.println(r.newRange(1,5).add(r.newRange(8,10)).isIn(6)); //=> returns false
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.