blob: 58396794bf8283ed1edbc467cf78bd7a9cb5c380 [file] [log] [blame]
// Copyright 2017 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.android.desugar.testdata.java8;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/** An interface with default methods, lambdas, and generics */
public interface GenericDefaultInterfaceWithLambda<T> {
T getBaseValue();
T increment(T value);
String toString(T value);
public default ArrayList<T> toList(int bound) {
ArrayList<T> result = new ArrayList<>();
if (bound == 0) {
return result;
}
result.add(getBaseValue());
for (int i = 1; i < bound; ++i) {
result.add(increment(result.get(i - 1)));
}
return result;
}
public default List<String> convertToStringList(List<T> list) {
return list.stream().map(this::toString).collect(Collectors.toList());
}
public default Function<Integer, ArrayList<T>> toListSupplier() {
return this::toList;
}
/** The type parameter is concretized to {@link Number} */
interface LevelOne<T extends Number> extends GenericDefaultInterfaceWithLambda<T> {}
/** The type parameter is instantiated to {@link Integer} */
interface LevelTwo extends LevelOne<Integer> {
@Override
default Integer getBaseValue() {
return 0;
}
}
/** An abstract class with no implementing methods. */
abstract static class ClassOne implements LevelTwo {}
/** A class for {@link Integer} */
class ClassTwo extends ClassOne {
@Override
public Integer increment(Integer value) {
return value + 1;
}
@Override
public String toString(Integer value) {
return value.toString();
}
}
/** A class fo {@link Long} */
class ClassThree implements LevelOne<Long> {
@Override
public Long getBaseValue() {
return Long.valueOf(0);
}
@Override
public Long increment(Long value) {
return value + 1;
}
@Override
public String toString(Long value) {
return value.toString();
}
}
}